Поднимите CellValueChanged из пользовательского элемента управления для редактирования в DataGridView. - PullRequest
4 голосов
/ 21 октября 2008

У меня есть DataGridView (WinForms), в котором я определил пользовательский EditingControl, производный от DataGridViewTextBoxEditingControl, который допускает только цифровые символы.

Мне нужно вызывать событие CellValueChanged в DataGridView каждый раз, когда пользователь нажимает клавишу, но по умолчанию вызывается событие только после завершения редактирования.

Как я могу вызвать событие при каждом нажатии клавиши?

public class DataGridViewNumericTextBoxEditingControl : DataGridViewTextBoxEditingControl
{
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        e.Handled = Char.IsLetter(e.KeyChar);
        if (!e.Handled)
            RaiseDataGridViewCellValueChanged(); // <-- Any way?
    }
}

Обновление:

Я нашел обходной путь, но я не уверен, что это хорошее решение:

public class DataGridViewNumericTextBoxEditingControl : DataGridViewTextBoxEditingControl
{
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        e.Handled = Char.IsLetter(e.KeyChar);
        if (!e.Handled)
        {
            EditingControlDataGridView.EndEdit();
            EditingControlDataGridView.BeginEdit(false);
        }
    }
}

1 Ответ

1 голос
/ 23 октября 2008

Какова цель здесь? Похоже, вы пытаетесь создать маску клавиатуры, где какой-либо неподтверждающий символ выдает предупреждение? Если это так, вы можете найти счастье в DataGridView, добавив MaskedTextBoxColumn. MaskedTextBoxColumn контролирует ввод гораздо более разумным способом, чем принудительное изменение фиксации.

См. Здесь код, который показывает, как его использовать: http://msdn.microsoft.com/en-us/library/ms180996.aspx

В соответствии с вашими обновленными критериями в комментариях, похоже, что ваше решение, вероятно, примерно так же хорошо, как и будет. Однако поймите, что очень легко попасть в бесконечные циклы событий, когда у вас есть другие элементы управления, обновляемые в другом на основе событий клавиатуры. Вероятно, вам лучше всего иметь одного делегата в форме, который обрабатывает все события, поскольку он может предотвратить бесконечные циклы триггеров событий, отбрасывая ложные события на основе состояния.

По сути, это будет использование шаблона Presenter Model Viewer, где ваш делегат выступает в качестве докладчика и управляет трафиком вашего View (вашего пользовательского интерфейса).

Делая это, вы даже можете переместить логику Presenter в новый класс, к которому затем привязываете данные, что позволит вам полностью контролировать пользовательский интерфейс из одной логической конструкции, а не из мешанины обработчиков событий.

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