Что-нибудь нарисовать внизу последней строки в DataGridView? - PullRequest
0 голосов
/ 07 июня 2018

Я знаю, как рисовать, и на самом деле я могу рисовать (в этом случае это на самом деле выглядит как кнопка Добавить).Возникает проблема в том случае, когда в вертикальной полосе прокрутки достаточно много строк, в которых нет места для рисования моей кнопки «Добавить».

Я пытался решить эту проблему, установив AllowUserToAddRows вtrue.Это приведет к появлению новой строки, которая должна дать мне достаточно места, чтобы нарисовать кнопку «Добавить».

Но возникла еще одна проблема - мне нужно полностью предотвратить поведение новой строки (включается AllowUserToAddRows),например, по умолчанию, когда в последней строке что-то введено и завершено, новая строка всегда добавляется, и добавляет новый элемент к базовым связанным данным .Хотя я рисую кнопку добавления, полностью покрывающую внешний вид новой строки, но на самом деле она все еще там и привязана к базовым данным.

Это действительно совсем не приемлемо.Я попытаюсь перехватить какое-нибудь нажатие клавиши, например TAB, ENTER (в последнем ряду), но, похоже, этого недостаточно.

Итак, чтобы решить мою проблему, у нас есть 2 подхода:

  • Установите AllowUserToAddRows на false и каким-то образом заставьте DataGridView дать мне пробел в нижней части последней строки (даже когда много строк и появляются вертикальные полосы прокрутки).Таким образом, я всегда могу нарисовать свою кнопку ожидаемым образом и избежать неприятного поведения AllowUserToAddRow.

  • Установить AllowUserToAddRows на true и каким-то образом предотвратить поведение по умолчанию при добавлении новой строкипри взаимодействии некоторых стандартных пользователей (окончание редактирования, табуляция, ввод, ...) - на самом деле нам нужно, чтобы новая строка не могла быть добавлена ​​другим способом, кроме как нажатием на кнопку «Добавить» (которую я рисую).

Подойдет любой подход (хотя я предпочитаю первый, второй может работать почти все время, но все равно глючит - я действительно не верю в его осуществимость и надежность).

Здесьмоя попытка (после второго подхода, потому что у меня нет подсказки, чтобы решить эту проблему после первого подхода).

//override some messages
protected override void WndProc(Message m){
     //keydown
     if (m.Msg == 0x100){
        var vk = m.WParam.ToInt64();
        //for the last row
        if (CurrentCell.OwningColumn.DisplayIndex == ColumnCount - 1)
        {
            //intercept the TAB and ENTER
            if (vk == 0x9 || vk == 0xd){
                return;
            }
        }
     }
}

Обновление

Еще одна неприятная ошибка Winforms (возможно, они называют этоособенность).На самом деле DataGridView все еще оставляет нам пробел в конце (когда есть много строк), НО, как только он добавлен в некоторые специальные панели макета, такие как GroupBox, TableLayoutPanel, ... он не будет разделять пространство как по умолчанию,Чтобы избежать размещения в какой-либо панели макета иногда нелегко принять, мы можем настроить некоторые элементы GroupBox (используя обычную панель), но мы не можем легко настроить TableLayoutPanel.Я думаю, что это открывает другой подход (третий подход).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...