Autor Beitrag
Zegul-550
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Do 22.06.17 12:13 
Hallo zusammen,

Ich habe ein DataGridView. Über einen Button möchte ich den ausgewählten Datensatz weiter bearbeiten.
Jedoch schon in der Zeile
ausblenden C#-Quelltext
1:
DataGridViewRow row = dgv.Rows[dgv.CurrentRow.Index];					

bekomme ich die Fehlermeldungen:
Zitat:
Ein Ausnahmefehler des Typs "System.NullReferenceException" ist in Zegul.exe aufgetreten.

Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

Das DatagridView enthält Datensätze, die Anzahl sehe ich mit "dgv.RowCount".

Wie kann ich das Problem lösen, die Fehlermeldung sagt mir leider nicht viel.

Vielen Dank

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 22.06.17 13:20 
Hallo und :welcome:

die Fehlermeldung besagt, daß du auf ein Objekt zugreifst, welches null ist (also nicht initialisiert wurde).

Ich tippe darauf, daß bei dir dgv.CurrentRow null ist (am besten kannst du dies im Debugger vom Visual Studio anschauen).

Du müßtest also ein Abfrage einbauen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
if (dgv.CurrentRow != null)
{
  DataGridViewRow row = dgv.Rows[dgv.CurrentRow.Index];
  // ..
}
else
{
  // ...
}

Für diesen Beitrag haben gedankt: Zegul-550
Zegul-550 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Do 22.06.17 13:51 
Hallo und vielen Dank für die schnelle Antwort.

dgv.CurrentRow ist tatsächlich null. Ich weiß, das man nicht nach fertigen Lösungen fragt, aber meine C# Kenntnisse reichen leider nicht aus.
Bis jetzt war ich der Meinung, wenn ich auf das DataGridview zugreifen kann, stehen mir alle Methoden zur Verfügung. Auch mit dgv.Selected.Index bin ich leider nicht weiter gekommen.
Ich bekomme es einfach nicht hin, den Wert einer selektierten Zelle/Zeile eines DataGridview auszulesen und in eine Variable zu schreiben. Wie kann ich den das Objekt initialisieren?

Vielen Dank!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 22.06.17 15:13 
Warum dgv.CurrentRow bei dir null ist, kann ich so nicht sagen (hast du als Anwender denn aktiv eine Zelle ausgewählt?).

Kennst du denn den Unterschied zwischen Current und Selected? Current ist immer die gerade aktive Zelle (bzw. Zeile oder Spalte), während Selected eine Liste von ausgewählten Zellen darstellt (farblich mittels Highlight markiert).

Probiere aber mal die Beispiele unter How to: Get the Selected Cells, Rows, and Columns in the Windows Forms DataGridView Control, ob diese bei dir funktionieren.

Für diesen Beitrag haben gedankt: Zegul-550
Zegul-550 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Do 22.06.17 15:34 
Hallo Th69,

das Beispiel habe ich mal getestet. Schon dgv.GetCellCount(DataGridViewElementStates.Selected) gibt mir 0 zurück, obwohl eine Zelle markiert ist.
Jedoch "dgv.RowCount" gibt mir die exakte Anzahl der Datensätze. Unter Eigenschaften habe ich mal unter "SelectionMode" zwischen CellSelect und FullRowSelect gewechselt, ohne Erfolg.

Danke und Gruß
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 22.06.17 15:50 
Was gibt denn dgv.SelectedRows.Count aus?

Wenn das auch 0 zurückgibt, dann probiere mal direkt eines der DataGridView-Ereignisse aus, z.B. CellEnter oder SelectionChanged und benutze dort dann den Beispiel-Code.


Zuletzt bearbeitet von Th69 am Do 22.06.17 17:13, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: Zegul-550
Zegul-550 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Do 22.06.17 16:16 
dgv.SelectedRows.Count gibt mir 1 zurück, was auch richtig ist. Jetzt benötige ich so etwas wie den Index, der selektierten Zeile.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 22.06.17 17:13 
Die einzelnen Rows stehen ja dann in dgv.SelectedRows[n] drin, und dort dann auch der Index.
Wenn du nur die erste (einzige) selektierte Zeile haben willst:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
if (dgv.SelectedRows.Count > 0)
{
  var row = dgv.SelectedRows[0];
  int index = row.Index;
}

Für diesen Beitrag haben gedankt: Zegul-550
Zegul-550 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Do 22.06.17 18:22 
Erst einmal vielen Dank für die Geduld mit mir. Langsam kommen wir dem Fehler näher.

Mit:
ausblenden C#-Quelltext
1:
2:
row = dgv.SelectedRows[0];
string guid = row.Cells["guid"].Value.ToString();
kann ich die Zelle auslesen. Aber es ist die Falsche!!!
Zitat:
Der Ausnahmefehler des Typs "System.NullReferenceException" in Zegul.exe ist aufgetreten, als ich nur 1 Datensatz im DataGridView hatte.

Bei 1 Datensatz im DataGridView ist dgv.RowCount = 1 - das ist ok
dgv.SelectedRows.Count = 0 - das ist falsch weil 1 Datensatz markiert.

Ich versteh das nicht.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 22.06.17 19:24 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: Zegul-550
Zegul-550 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Do 22.06.17 19:32 
Ja, die ganze Zeile ist markiert. Ich habe beide Varianten probiert.
Die Spalte guid ist vorhanden. Wenn ich mehrere Datensätze im dgv habe bekomme ich ja auch Ergebnisse, nur die Falschen.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 22.06.17 19:38 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: Zegul-550
Zegul-550 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Do 22.06.17 19:44 
Die guid ist nicht die vom selektierten Datensatz.
Der Kommentar im Quelltext ist interessant. Wäre das ein Ansatz? Warum kommt bei nur einem Datensatz die Fehlermeldung?
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 22.06.17 19:49 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: Zegul-550
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 22.06.17 20:04 
Ein wenig mehr Context als der Code würde auch helfen.
Zum Beispiel ob du MultiSelect zulässt oder nicht.

Und mir ist immer noch nicht klar welche Row du den jetzt genau willst? Die fokussierte Row oder eine der selektierten Rows? Die fokussierte Row muss nicht auch selektiert sein. Und eine selktierte Row muß keinen Focus haben. Das fokussiert/selektiert sind zwei zu unterscheidende Konzepte die nur manchmal zusammenfallen.

Für diesen Beitrag haben gedankt: Zegul-550
Zegul-550 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Fr 23.06.17 13:54 
Hallo zusammen,

die Frage nach dem ButtonClick war der richtige Tip. Ich habe idiotischer Weise den Delete-Button vom BindingNavigator benutzt.
Das klärt natürlich einiges.
Der Datensatz wird aus dem DataGridview entfernt und ich bekomme die guid vom nächsten Datensatz. Bei nur einem Datensatz erhalte ich dann die "System.NullReferenceException".

Ich sehe keine andere Möglichkeit, wenn ich den Delete-Button benutzen möchte, schon bei der Auswahl eines Datensatzes die guid in eine Variable zu schreiben.

Vielen Dank an alle, die mir geholfen haben.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 23.06.17 15:09 
Merke dir doch bei der zum BindingNavigator zugehörigen BindingSource die aktuelle Zeile: BindingSource.CurrentChanged oder BindingSource.PositionChanged.

Und der BindingNavigator (bzw. dessen BindingSource) benutzt immer CurrentRow (also die fokussierte Zeile), nicht SelectedRows.

Es hätte den Beitrag hier deutlich verkürzt, wenn du von Anfang an geschrieben hättest, daß du den BindingNavigator einsetzt. Ich (und sicherlich andere Leser auch) bin von einem eigenständigen Button ausgegangen.