Получение строки в обработчике событий RowEnter для новой строки

#c# #datagridview

#c# #datagridview

Вопрос:

У меня есть DataGridView с источником привязки. Когда я добавляю новую строку, щелкая по ней, запускается событие RowEnter. По какой-то причине это CellEvent, а не RowEvent, поэтому я не получаю свойство Row в аргументах. Свойство RowIndex равно 0 (строк много — myDataGridView.Rows[0] неверно). Как мне получить ссылку на фактическую строку или элемент DataBoundItem за ней?

РЕДАКТИРОВАТЬ: кажется, что я на самом деле получаю два события RowEnter. Первый имеет RowIndex 0, а второй имеет правильный. Проблема сейчас в том, что я не могу отличить первое из этих событий от законного RowEnter, выданного из фактической первой строки.

Ответ №1:

Вы можете получить ее с помощью e.RowIndex

 private void dataGridView1_RowEnter(object sender, 
    DataGridViewCellEventArgs e)
{
    for (int i = 0; i < dataGridView1.Rows[e.RowIndex].Cells.Count; i  )
    {
        dataGridView1[i, e.RowIndex].Style.BackColor = Color.Yellow;
    }
}
 

Источник: DataGridView.Событие RowEnter

Комментарии:

1. Он говорит, что RowIndex равен 0, когда этого не должно быть. Возможно, это какая-то проблема из-за связанной коллекции.

Ответ №2:

Возможно, ваша проблема как-то связана с особенностями последовательности и ответственности событий сетки данных.

Взято из http://social.msdn.microsoft.com/forums/windows/en-US/14c08e1f-7819-4687-8e4e-1df8632a8431/datagridviewselectionchanged-unexpected-behavior:

DataGridView.RowEnter происходит перед DataGridView.SelectionChanged, поэтому он бесполезен для получения последних данных DataGridView.

SelectionChanged, по-видимому, является последним событием, вызываемым при изменении строки. Пожалуйста, дайте мне знать, если кто-нибудь знает о более позднем событии. DataGridView.SelectionChanged имеет новую ячейку dataGridView1.CurrentCell.RowIndex, если пользователь нажал на новую строку в DataGridView

DataGridView.SelectionChanged имеет старую dataGridView1.CurrentCell.RowIndex, если программа перемещает строку с помощью:

     dataGridView1.ClearSelection();
    dataGridView1.CurrentCell = dataGridView1.Rows[3].Cells[0]; // Or whatever new row you want
    dataGridView1.Rows[3].Selected = true;
 

И теперь … , selectedRows[0] .Индекс вернет новый RowIndex при
щелчке или запрограммированном перемещении!!!

Или ваша проблема на самом деле связана с какой-то проблемой в базовой привязке и связанной коллекции.