Получить содержимое ячейки выбранной строки в DataGridView - PullRequest
8 голосов
/ 21 апреля 2011

У меня DataGridView заполнено из базы данных.

Я пытаюсь получить содержимое строки, выбранной в событии RowEnter. Я установил режим выбора сетки на FullRowSelect

Я пробовал следующее:

int orderId = (int)dgUnprocessedCards.Rows[dgUnprocessedCards.SelectedCells[0].RowIndex].Cells[0].Value;

это выдает ошибку

Индекс был вне диапазона. Должен быть неотрицательным и меньше размера коллекции.

Любая помощь приветствуется.

Ответы [ 3 ]

12 голосов
/ 21 апреля 2011

Я только что попробовал это в примере приложения datagridview, и оно прекрасно работает, поэтому должно быть что-то происходящее, о чем вы нам не рассказали.

Первое, что нужно сделать, это сломать один большойоператор в отдельные меньшие операторы, чтобы вы могли точно видеть, где происходит сбой.

Вы можете переписать приведенный выше код примерно так для целей отладки:

var cellindex = dgUnprocessedCards.SelectedCells[0].RowIndex;           
var cellcollection = dgUnprocessedCards.Rows[cellindex].Cells[0];

int orderId = (int)dgUnprocessedCards.Value;

Кроме того, вы должны бытьв состоянии сделать следующее, чтобы достичь того, что вы хотите:

int orderId = (int)dataGridView1.SelectedRows[0].Cells[0].Value;

Это использует коллекцию SelectedRows, которая является немного более краткой, и я бы сказал, более обычный способ доступа к выбранным элементам из представления данных.

Наконец, вы, вероятно, захотите выполнить проверку вашего приведения значения, поскольку значение может не обязательно быть int.Что-то вроде:

int orderid;
if (!int.TryParse(cellcollection.Value.ToString(), out orderid))
{
    // Some logic to deal with the fact that Value was not an int
}

Когда вызывается событие SelectionChanged?

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

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

Если вы добавите обработчик событий для события DataBindingComplete и добавите туда обработчики событий SelectionChanged или RowEnter, вы не должны видеть обработчик, вызванный во время привязки данных.

void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    this.dataGridView1.RowEnter += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_RowEnter);
    this.dataGridView1.SelectionChanged += new System.EventHandler(this.dataGridView1_SelectionChanged);
}

Обратите внимание, что вам нужно удалить сгенерированное дизайнером вложение события и ссылаться на сгенерированные дизайнером методы, чтобы это работало.

1 голос
/ 31 мая 2013

Это также работает:

int orderId = (int)dgUnprocessedCards.SelectedCells[0].OwningRow.Cells[0].Value;
0 голосов
/ 27 апреля 2011

То, что я пытался сделать, работало нормально, но привязка вызывала событие изменения выбора. Поэтому я сделал то, что предложил Дэвид Холл (прикрепление и отсоединение события), и также поместил его в блок try catch, и теперь он работает отлично.

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