Laden...

datagridview: DataGridViewCell.Value.**get** hat null zurückgegeben.

Erstellt von Myfly vor 2 Jahren Letzter Beitrag vor 2 Jahren 759 Views
M
Myfly Themenstarter:in
10 Beiträge seit 2021
vor 2 Jahren
datagridview: DataGridViewCell.Value.**get** hat null zurückgegeben.

Hallo liebe Community,

ich bin blutiger Anfänger im programmieren und verstehe folgendes nicht. Die Variablen sind alle richtig befüllt. Aber laut Fehler wurde NULL zurückgegeben.
Wer kann mir helfen das richtig zu verstehen ?

Besten Dank schon jetzt ! Danke !

5.658 Beiträge seit 2006
vor 2 Jahren

Die erste Spalte heißt doch "location" und nicht "locationdatagrid", oder?

Weeks of programming can save you hours of planning

16.825 Beiträge seit 2008
vor 2 Jahren

Ich kann nicht erkennen, wie die Bilder zusammen passen.
Die Cell wird abgefragt mit "locationdatagrid" aber im Screenshot der Tabelle ist nur "location" die Spalte.

IIRC wars beim DGV so, dass null heisst, dass die Information nicht geladen wurde, und sie empty ("") ist, wenn nichts drin ist.
Schreib daher mal


var cell = row.Cells["NameHier"].Value;
if (cell != null) {
               
}

Auf ein potentielle Null-Eigenschaft direkt ein Methode anzusetzen widerspricht ohnehin dem Prinzip der defensiven Programmierung.
Noch besser und schlauer wäre es gar nicht auf der UI-Ebene zu arbeiten, sondern auf dem Binding. Auf der UI zu agieren is eh nie so ne dolle Idee.
https://docs.microsoft.com/de-de/dotnet/desktop/winforms/controls/how-to-access-objects-bound-to-windows-forms-datagridview-rows?view=netframeworkdesktop-4.8

M
Myfly Themenstarter:in
10 Beiträge seit 2021
vor 2 Jahren

Hallo Ihr Beiden,

danke für euere Zeit.

@Abt - war leider nicht zielführend.

Der Headertext ist: location
Der Name ist: locationdatagrid

Alle Variablen erhalten ja auch alle richtigen Werte aus dem Grid, ABER dann kommt die Fehlermeldung.

5.658 Beiträge seit 2006
vor 2 Jahren

Alle Variablen erhalten ja auch alle richtigen Werte aus dem Grid, ABER dann kommt die Fehlermeldung.

An welcher Stelle gibt es denn die Exception?

Weeks of programming can save you hours of planning

M
Myfly Themenstarter:in
10 Beiträge seit 2021
vor 2 Jahren

Das weiß ich leider nicht - ich glaube im ersten Bild oben, ist die Stelle markiert.
Es ist schon komplex zu lernen am Anfang 😦

Jedenfalls kommt der gleiche FEhler, auch wenn ich nur eine Zeile drin stehen habe.


 string locationtovar = row.Cells["locationdatagrid"].Value.ToString();   

16.825 Beiträge seit 2008
vor 2 Jahren

Du kannst via Debugging schauen, was genau null ist.
[Artikel] Debugger: Wie verwende ich den von Visual Studio?
Wir bräuchten dazu eine Glaskugel 🙂

Schau die einzelnen Bestandteile der Zeile an, die Null wirft.


var cell = row.Cells["locationdatagrid"];
var value = cell.Value;

etc...

M
Myfly Themenstarter:in
10 Beiträge seit 2021
vor 2 Jahren

Danke für die Links !

Step by Step Debugging:

  • 1: Es geht erst jede einzelne Zeile durch (durch foreach ?¿),

  • 2: Dann springt er zur ersten Zeile **string locationtovar = row.Cells["locationdatagrid"].Value.ToString(); ** Die Variable _locationtovar _erhält den richtigen Wert aus dem GridView

  • 3: Beim nächsten Step kommt der Fehler

Dein Code:
var cell = row.Cells["locationdatagrid"].Value;
if (cell != null) {}
peinlich, aber hab ich leider nicht verstanden 😦


Mit dem Murks unten kommt 1 MessageBox mit der richtigen variable, nach dem schließen eine Weitere die leer ist.


var cell = row.Cells["locationdatagrid"];
                string value = (string)cell.Value;
                MessageBox.Show(value);

16.825 Beiträge seit 2008
vor 2 Jahren

Das ist kein Murks, sondern nennt sich Casting - das Du nicht bräuchtest, würdest Du mit Bindings arbeiten.
Der Zelle ist der Datentyp offenbar unbekannt - ergo muss gecastet werden.

[FAQ] Casten aber richtig: Boxing/Unboxing - () / is / as / Pattern Matching

D
152 Beiträge seit 2013
vor 2 Jahren

Ich habe ewig nichts mehr mit Winforms und dem DGV gemacht.

Aber kann es sein das die NullReferenceException beim zweiten Durchlauf kommt.
Ich meine wenn die Rows durchlaufen werden sind alle dabei, auch die Zeile um eine neue zustellen dabei.

M
Myfly Themenstarter:in
10 Beiträge seit 2021
vor 2 Jahren

Lösung gefunden - Fehler nicht 😉


 foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    string locationtovar = row.Cells["locationdatagrid"].Value.ToString();                
                    string hoehetovar = row.Cells["hoehedatagrid"].Value.ToString();
                    string nummertovar = row.Cells["nummerdatagrid"].Value.ToString();
                    string statustovar = row.Cells["statusdatagrid"].Value.ToString();
                    string arttovar = row.Cells["artdatagrid"].Value.ToString();
                    string kommentartovar = row.Cells["kommentardatagrid"].Value.ToString();
                    string fotolinktovar = row.Cells["fotolinkdatagrid"].Value.ToString();

                   break;  // <----------- Beim ersten Durchlauf schreibt er die Werte in die Variablen, beim 2ten auch, dann kommt der Fehler. Hiermit nicht
                   }

D
152 Beiträge seit 2013
vor 2 Jahren

break ist aber keine Lösung. Denn was machst Du, wenn es mehr als eine Zeile ist.

Schaue dir DataGridViewRow.IsNewRow Eigenschaft an.

16.825 Beiträge seit 2008
vor 2 Jahren

Beim ersten Durchlauf schreibt er die Werte in die Variablen, beim 2ten auch, dann kommt der Fehler. Hiermit nicht

Das wäre eine Info gewesen, die Du per Debugger locker gefunden hättest - das ist nämlich in keinem Bild ersichtlich.
Gut, dass wir jemand wie david.m hier hatten, der das noch wusste 🙂

M
Myfly Themenstarter:in
10 Beiträge seit 2021
vor 2 Jahren

Ja....es tut mir auch schrecklich Leid, aber ihr erinnert euch warscheinlich nicht mal mehr an eure Anfangszeiten 😉
Manchmal raucht meine Rübe schon ordentlichst....

@david.m
Der ursprünglicher Plan war: Direkt einzelne Zellen aus einer MySQL Datanbank zu lesen und in Variablen zu packen.

Daraus geworden ist: Ein Import aus einer MySQL Datanbank in eine DataGridView aus der ich den Inhalt der jeweiligen Columns der einzelnen importierte Zeile auslese und in Variablen packe. Deswegen wird temporör "break;" helfen, da ich nur 1 Zeile importieren muss.

@Abt
Ich werde mir das nächste mal noch mehr Mühe geben. :•]

16.825 Beiträge seit 2008
vor 2 Jahren

Vorweg: ich seh auch dass Du mich anschreibst ohne dass Du den Text Fett und in 27 verschiedenen Farben markierst 🙂

aber ihr erinnert euch warscheinlich nicht mal mehr an eure Anfangszeiten

Deswegen versuchen wir Dir zu sagen, wie man es richtig macht - weil wir die Probleme kennen.
zB dass man Daten lieber binden sollte, statt über UI Controls zu interagieren. Das macht nan so halt nicht, weil es Probleme verursacht, die man sich damit selbst schafft.
Sags Dir daher gern ein drittes Mal: arbeite mit typisierten Daten, zB über Bindung - siehe Link oben.

Keiner sagt Dir sowas, um Dich zu ärgern.