Зафиксируйте текущую грязную ячейку, нажав кнопку «Сохранить» в любом представлении данных в форме - PullRequest
3 голосов
/ 14 декабря 2009

У меня есть форма с несколькими представлениями данных. При сохранении весь набор данных будет сериализован в строго типизированное свойство, привязанное к sql varbinary (max). Отлично работает.

Конечно, текущая «грязная» ячейка не будет сохранена, как указано здесь:

DataGridView - Значение не сохраняется, если выборка не потеряна из ячейки

Моя проблема в том, что пользователь может перейти из любого из 20 представлений данных, когда они нажимают СОХРАНИТЬ.

Есть ли способ, кроме проверки наличия грязной ячейки в каждом представлении данных, для фиксации любой грязной ячейки перед сохранением (щелчок по другому элементу управления текстовым полем перед сохранением делает трюк, но вызывает focus () этого текстового поля до сохранения не)

Я подумал, что, возможно, перехватить событие ухода из сетки, но, похоже, основная проблема заключается в том, что нажатие кнопки (по причинам, которые, я думаю, я понимаю) не запускает события lostfocus для текущего элемента управления и не похоже на обработчик нажатия args знает, какой последний текущий выбранный элемент управления.

Руководство ценится.

ТИА

Ответы [ 2 ]

1 голос
/ 15 декабря 2009

Подключите все ваши таблицы данных к одному и тому же обработчику событий Leave. Событие выхода обрабатывается до события щелчка. Внутри события отпуска запишите обзор данных, который только что потерял фокус. При нажатии кнопки сохранения проверьте, есть ли в последнем просмотре таблицы данных несохраненные данные ...

Пример:

    DataGridView _lastDataGridView = null;
    private void dataGridView_Leave(object sender, EventArgs e)
    {
        _lastDataGridView = sender as DataGridView;
    }

    private void saveButton_Click(object sender, EventArgs e)
    {
        if (_lastDataGridView != null)
        {
            // check if data needs saving...
        }
    }

Редактировать 1: Что касается того, что вы не получили событие выхода до события click, я не вижу такого поведения. Чтобы воспроизвести то, что я сделал, создайте форму с DataGridView и кнопкой. Добавьте два столбца текстового поля в DataGridView, подключите события, как описано, и посмотрите, установлен ли элемент _lastDataGridView при выполнении sendButton_Click. Это на моем конце.

Редактировать 2: Попробовав мое представление данных, я заметил, что данные всегда сохраняются. Так что я подозревал, что у вас были разные настройки. Я включил «VirtualMode». Это вызывает то же поведение, которое вы описываете. Если возможно, попробуйте отключить VirtualMode и посмотреть, будут ли данные сохранены в DataGridView, как ожидалось. В противном случае попробуйте реализовать рекомендации, изложенные в этой статье MSDN.

0 голосов
/ 16 декабря 2009

Почему бы не использовать событие DataGridView CellEndEdit, чтобы пометить логический флаг, что DGV загрязнен? Предполагая, что вы используете SQL, вы должны создать UpdateCommand, SelectCommand и DeleteCommand для каждого DGV. Если вы хотите «сохранить» изменения, просто наберите DataAdapter.Update(myDataSet, "TABLE NAME"); для DataAdapter, связанного с вашим DataGridView. Сейчас я использую эту технику для одного DGV, и она отлично работает.

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