2016-03-26 10 views
0

Ich habe eine Winform, die eine Gridview hat, dass ich Daten über ein Dataset anwenden. Wenn die Daten gebunden sind, ruft sie den SelectionChanged-Ereignishandler auf. Ich habe das recherchiert und einen Weg gefunden, indem ich eine if-Klausel hinzufügte, um zu sehen, ob der DGV den Fokus hat (alle anderen Auflösungen funktionierten nicht, die ich fand). Dieser Teil funktioniert wie geplant. Wenn ich das Programm durchtrete, versucht der Event-Handler, den Code drei Mal zu durchlaufen, wenn er die Daten bindet. Die if-Klausel verhindert, dass der Code erreicht wird. Mein Problem ist, nachdem die Daten bindet und ich wähle dann eine Zeile in der DGV, der Event-Handler wirft dann "Eine nicht behandelte Ausnahme vom Typ 'System.ArgumentOutOfRangeException' aufgetreten in mscorlib.dll". Beim Durchlaufen des Codes gibt DGV den richtigen Zeilenindex an meine Variable 'int row' zurück, aber der Code, mit dem ich die Zeilen-/Zelleninformationen abrufe, löst den Fehler aus, bevor er auf die Variable 'loadtableID' angewendet wird. Ich brauche Hilfe. Sie können den zweiten DGV oben ignorieren. Er nimmt die Informationen der ausgewählten Zeile und ruft eine andere DB-Tabelleninformation ab. Wenn es hilft, habe ich keine Datenquelle auf das Programm angewendet oder Datensätze für jedes einzelne Dataset erstellt, das zurückgegeben wird. Ich verwende das generische Dataset des Systems, wenn Daten zurückgegeben werden.Fehler beim Versuch, von DataGridView mit Ereignishandler Winform zu lesen

 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... 

Antwort

0

Sie verwenden den RowIndex-Wert, um Ihren Text aus der SelectedRows-Auflistung abzurufen.
Aber diese Sammlung enthält nur

die Sammlung von Zeilen, die vom Benutzer ausgewählt Ruft.

Dies bedeutet, dass die Auflistung nur eine Teilmenge der in Ihrem Raster vorhandenen Zeilen enthält. Wenn RowIndex 2 ist und Sie nur eine Zeile in der SelectedRows-Auflistung haben, erhalten Sie die OutOfRange-Ausnahme.

Mit dem RowIndex Wert, den Sie in die Reihen Sammlung

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

Das DGV Sie sich beziehen ist nicht das gleiche, es ist eine andere Stelle verweisen sollte. Ich habe 2 (gvMainSelectResults, das ist das, das gefüllt wird, und gvMainArchiveResults, das die Informationen aus dem ersten verwendet, um das zweite zu füllen, also löscht sich das 2. DGV jedes Mal, wenn sie eine neue Zeile auswählten, und wendet das neue Dataset an) . Aus diesem Grund wurde gvMainArchiveResults am Anfang des Codes platziert. – Terran28

+0

aktualisierter Code mit Bemerkungen – Terran28

+0

Ich sehe, aber ich denke, ich habe das Problem jetzt gefunden. Aktualisierung der Antwort – Steve

Verwandte Themen