DataGridView -Value не сохраняется, если выделение не потеряно из ячейки - PullRequest
8 голосов
/ 08 июня 2009

Я использую элемент управления DataGridView для чтения и записи файла XML с помощью XML-сериализации.

У меня есть проблема, как объяснено ниже:

  1. Я читаю файл XML и заполняю элементы управления DataGridView десериализованным объектом.
  2. Я обновляю все значения в DataGridView в ячейке.
  3. Я выбираю опцию File Save As, не теряя фокус на последней ячейке.

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

Может кто-нибудь предложить какое-либо решение для этого?

Ответы [ 6 ]

16 голосов
/ 19 ноября 2009

Лучший способ (хоть и быстрый и грязный) - присвоить значение currentCell Nothing.

Например, в методе сохранения выполните:

dgvMyGrid.CurrentCell = Nothing

, а затем продолжить.

16 голосов
/ 08 июня 2009

Это потому, что отредактированное значение ячейки не передается в источник данных, пока не будет проверено, что происходит, когда ячейка теряет фокус. Если вы хотите немедленно зафиксировать изменения, вы можете обработать событие CurrentCellDirtyStateChanged и вызвать метод CommitEdit в обработчике:

void dataGridView1_CurrentCellDirtyStateChanged(object sender,
    EventArgs e)
{
    if (dataGridView1.IsCurrentCellDirty)
    {
        dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
}
4 голосов
/ 08 июня 2009

Если я правильно вас понимаю, ячейка находится в режиме редактирования, и вы пытаетесь программно прекратить редактирование и передать значение в базовый источник данных?

Я использую несколько «грязный» подход для этого в одном из моих приложений:

if (dataGridView1.CurrentCell.IsInEditMode)    
{    
    int y = dataGridView1.CurrentCellAddress.Y;    
    int x = dataGridView1.CurrentCellAddress.X;    
    if (y > 0)      
        dataGridView1.CurrentCell = dataGridView1.Rows[y - 1].Cells[x];    
    else    
        dataGridView1.CurrentCell = dataGridView1.Rows[y + 1].Cells[x];    
    dataGridView1.CurrentCell = dataGridView1.Rows[y].Cells[x];    
}

Этот фрагмент кода сначала проверяет, находится ли текущая ячейка в режиме редактирования. Затем он автоматически изменяет текущую ячейку (либо на предыдущую, либо на следующую строку, если мы находимся в первой строке). После этого восстанавливается текущий выбор ячейки.

Вы бы назвали этот код в вашем обработчике "Сохранить как файл".

0 голосов
/ 26 апреля 2016

ОК, это УЖАСНО, но работает, чтобы получить ЗАКЛЮЧИТЕЛЬНЫЕ ИЗМЕНЕНИЯ из сетки БЕЗ перехода в другую строку:

With DataGridView1
    .DataSource = Nothing
    .DataSource = gridDataTable
    Dim changedFoo As DataTable = gridDataTable.GetChanges
End With

Однако мне все еще нравится ответ от Амит Кармакар. Я добавил DataGridView1.CurrentCell = Nothing в событие DataGridView1 LostFocus.

0 голосов
/ 14 февраля 2011

У меня была такая же ситуация, и я даже использовал клавиши ускорения для кнопки сохранения для сохранения значений сетки. Когда я нажимаю кнопку «Сохранить», фокус теряется от DGV и, следовательно, значение ячейки фиксируется, но когда я использую клавиши ускорения, фокус не теряется от DGV, следовательно, фиксация значения ячейки не происходит.

Посмотрев на ответ Амит Кармакар из любопытства, я попробовал этот ответ, и он сработал. Чтобы узнать больше деталей, я пошел в отладку DGV и обнаружил, что это действительно то же самое, что commitedit, который почему-то не работает, если вы используете его при нажатии кнопки сохранения.

Когда мы устанавливаем для CurrentCell из DGV значение NULL, перед его установкой в ​​NULL DGV сначала получает отредактированное значение и помещает его в значение ячейки, а затем устанавливает для CurrentCell REFERENCE значение NULL. Здесь это не означает, что он устанавливает пустую ячейку DGV. Следовательно, это прекрасно работает для вышеуказанной проблемы.

Примечание. Это решение может работать некорректно, если у вас есть события проверки для ячейки и если пользователь вводит неверные данные, которые не пройдут проверку. В этом случае установка текущей ячейки на ноль также не удалась, поскольку она не может передать значение в ячейку.

Я дал это объяснение, когда поднял вопрос об ответе Амит Кармакар, спрашивая, как это возможно. Я подумал, что это может помочь другим, поэтому отбросил это объяснение как ответ.

0 голосов
/ 29 июля 2009

Вы можете получить значение ячейки, которая еще не зафиксирована, используя свойство EditedFormattedValue для текущей ячейки, как показано ниже

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