2016-03-26 6 views
0

У меня есть winform, которая имеет gridview, с которой я применяю данные через набор данных. Когда данные связываются, он вызывает обработчик события SelectionChanged. Я исследовал это и нашел способ обойти его, добавив предложение if, чтобы узнать, имеет ли DGV фокус (все остальные разрешения не работают, что я нашел). Эта часть работает как и планировалось. Когда я просматриваю программу, обработчик события пытается пройти код 3 раза, когда он связывает данные. Предложение if не позволяет ему получить код. Моя проблема связана с привязкой данных, и затем я выбираю строку в DGV, тогда обработчик событий выдает «Необработанное исключение типа« System.ArgumentOutOfRangeException », произошедшее в mscorlib.dll». При переходе через код DGV возвращает правильный индекс строки в мою переменную «int row», но код, который я использую для получения информации о строках/ячейках, выдает ошибку до того, как она применит ее к переменной «loadtableID». Мне нужна помощь. Вы можете игнорировать второй DGV в верхней части. Он берет информацию о выбранной строке и получает другую информацию таблицы БД. Кроме того, если это помогает, я не применял источник данных к программе или не создавал наборы данных для каждого отдельного набора данных, который возвращен, я использую общий набор данных системы при возврате данных.ошибка при попытке чтения из DataGridView с обработчиком событий winform

 private void gvMainSelectResults_SelectionChanged(object sender, EventArgs e) 
    { 
     if (gvMainSelectResults.Focused) 
     { 
      gvMainArchiveResults.DataSource = null; //second DGV that is populated later and everytime is cleared with a new selection 

      loadTableID = 0; 
      orgID = 0; 
      dbFileName = ""; 
      sourceType = ""; 

      int row = gvMainSelectResults.CurrentCell.RowIndex; 
      loadTableID = Convert.ToInt32(gvMainSelectResults.SelectedRows[row].Cells["LoadTableID"].Value); //this is where I get the error, even if the "int row" has the correct index number 
      orgID = Convert.ToInt32(gvMainSelectResults.SelectedRows[row].Cells["OrganizationID"].Value); 
      dbFileName = Convert.ToString(gvMainSelectResults.SelectedRows[row].Cells["FileName"].Value); 
      sourceType = Convert.ToString(gvMainSelectResults.SelectedRows[row].Cells["SourceType"].Value); 

      more code here... 

ответ

0

Вы используете значение RowIndex, чтобы получить текст из коллекции SelectedRows.
Но эта коллекция содержит только

Получает коллекцию строк, выбранных пользователем.

Это означает, что коллекция содержит только подмножество строк, присутствующих в вашей сетке. Когда RowIndex равен 2, и у вас есть только одна строка в коллекции SelectedRows, вы получаете исключение OutOfRange.

При значении RowIndex вы должны относиться к коллекции Rows вместо

loadTableID = Convert.ToInt32(gvMainSelectResults.Rows[row].Cells["LoadTableID"].Value); 
orgID = Convert.ToInt32(gvMainSelectResults.Rows[row].Cells["OrganizationID"].Value); 
dbFileName = Convert.ToString(gvMainSelectResults.Rows[row].Cells["FileName"].Value); 
sourceType = Convert.ToString(gvMainSelectResults.Rows[row].Cells["SourceType"].Value); 
+0

Это DGV вы имеете в виду не то же самое один, то другой один. У меня есть 2 (gvMainSelectResults, который является заполненным, и gvMainArchiveResults, который использует информацию из первой, чтобы заполнить вторую, поэтому каждый раз, когда они выбирают новую строку, вторая DGV очищается и будет применять новый набор данных) , Вот почему gvMainArchiveResults был помещен наверху кода. – Terran28

+0

обновленный код с замечаниями – Terran28

+0

Я вижу, но я думаю, что нашел проблему сейчас. обновление ответа – Steve

 Смежные вопросы

  • Нет связанных вопросов^_^