| |
VB.NET - FortgeschritteneWert einer Zelle in einem DataGridView prüfen | | | Autor: Schudi | Datum: 14.02.23 20:29 |
| Vermutlich eine saudumme Frage, aber ich stehe gerade auf dem Schlauch:
Ich möchte prüfen, ob in einer bestimmten Zelle eines DataGridView etwas drin steht.
DGVKundendaten.CurrentCell = DGVKundendaten.Rows(i).Cells(3)
If DGVKundendaten.CurrentCell.ToString <> "" Then
'mach irgendwas
End If führt aber nicht zum Erfolg.
Die Bedingung trifft offenbar immer zu. Der Code im Then-Zwei wird immer durchlaufen, auch wenn der Debugger für DGVKundendaten.CurrentCell.ToString den Inhalt "" anzeigt. Dasselbe passiert bei Prüfung auf Nothing.
Wie kann ich abfragen, ob in der betreffenden Zelle etwas drin steht oder nicht?
Herzlichen Dank für Eure Hilfe. | |
Re: Wert einer Zelle in einem DataGridView prüfen | | | Autor: Kuno60 | Datum: 14.02.23 22:15 |
| benutze:
DGVKundendaten.CurrentCell.Value.ToString() | |
Re: Wert einer Zelle in einem DataGridView prüfen | | | Autor: Schudi | Datum: 14.02.23 22:44 |
| Oh mein Gott, wie dumm kann ich sein...
Vielen Dank.
In der Ausgabe selber verwende ich natürlich "DGVKundendaten.CurrentCell.Value.ToString()" aber in der Bedingung ist mir das Value irgendwie abhanden gekommen. Hab ich bei zig Mal ansehen nicht gemerkt.
Danke! | |
Re: Wert einer Zelle in einem DataGridView prüfen | | | Autor: Manfred X | Datum: 16.02.23 13:08 |
| Hallo!
Schau Dir auch mal die IsDBNULL-Methode an. | |
Re: Wert einer Zelle in einem DataGridView prüfen | | | Autor: Schudi | Datum: 17.02.23 04:19 |
| Hallo Manfred,
inzwischen klappt es zwar schon, nachdem ich das vergessene "Value" eingefügt habe, mit der Prüfung auf "" aber das sehe ich mir an. Vermutlich ist das eleganter und man lernt ja immer gerne dazu.
Also vielen Dank für den Hinweis. | |
Re: Wert einer Zelle in einem DataGridView prüfen | | | Autor: Schudi | Datum: 17.02.23 18:33 |
| Hallo Manfred,
ich habe jetzt ein ähnliches Problem und verwende lt. Deinem Tipp IsDbNull.
Ich habe das Programm extra gedebuggt.
If IsDBNull(Kunde.EmailAdresse2) = True Then
outZeile += Feldtrenner
Else
outZeile += Kunde.EmailAdresse2 & Feldtrenner
End If Kunde.EmailAdresse2 ist als Typ = String in einer DataTable angelegt.
Immer bei Ausführen des If (mit F8-Eizelschritt) kommt es zu der Meldung
"Der Wert für Spalte EmailAdresse2 in Tabelle DTKunden ist DBNull."
Dieser Text stamm aus dem Code im Designer, auf den ich ja keinen Einfluss habe.
<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.CodeDom.Compiler.GeneratedCodeAttribute( _
"System.Data.Design.TypedDataSetGenerator", "15.0.0.0")> _
Public Property EmailAdresse2() As String
Get
Try
Return CType(Me(Me.tableDTKunden.EmailAdresse2Column),String)
Catch e As Global.System.InvalidCastException
Throw New Global.System.Data.StrongTypingException("Der Wert für" & _
"Spalte EmailAdresse2 in Tabelle DTKunden ist DBNull.", e)
End Try
End Get
Set
Me(Me.tableDTKunden.EmailAdresse2Column) = value
End Set
End Property Was kann ich tun, um Kunden.Emailadresse2 auszugeben wenn das Feld leer ist? Sobald im Feld etwas drin steht, ist alles ok.
Die Abfrage auf "" oder Nothing statt IsDbNull bringt dieselbe Meldung. | |
Re: Wert einer Zelle in einem DataGridView prüfen | | | Autor: Schudi | Datum: 18.02.23 08:42 |
| Das Verrückte an der Sache ist, dass ich genau dieselbe Abfrage an anderer Stelle auch habe und dort das Problem nicht auftritt.
Vielleicht sollte ich noch dazu erwähnen, dass DSKunden zunächst auf meiner Hauptform definiert ist und dort keine Probleme auftreten. Dann habe ich das fertig designte DataSet auf deine Unterform kopiert (copy/paste).
Die Daten im DataSet übergebe ich mit nachstehendem Code. Das Problem mit der Meldung tritt nur auf der Unterform auf und ich kann weder auf ISDbNull noch auf <> "" oder Nothing prüfen. Es kommt immer zu der Meldung. Auf der Hauptform hingegen klappt alles tadellos auch die Abfrage auf <> "".
Public Property DSKundendaten As DSKunden
'DSKunden ist über den Designer (in der Form) angelegt
Get
Return DSKunden
End Get
Set(value As DSKunden)
DSKunden = value
End Set
End Property Auf die einzelnen Kunden greife ich wie folgt zu (und zwar auf beiden Forms gleich):
For Each Kunde As DSKunden.DTKundenRow In DSKunden.DTKunden.Rows Ich habe das DataSet auch noch einmal neu kopiert von der Hauptmaske auf die Untermaske. Hat nix gebracht.
Mal abgesehen davon, dass es die Datei "DSKunden.Designer.vb" in der die Meldung steht, ja sowieso nur 1 Mal für das ganze Projekt gibt. Warum verhält sich das Ganze dann unterschiedlich?
Ich bin verwirrt, aber ich glaube jetzt habe ich alle wichtigen Infos zusammen, damit mir jemand helfen kann... | |
Re: Wert einer Zelle in einem DataGridView prüfen | | | Autor: Schudi | Datum: 18.02.23 15:07 |
| OK; mit folgendem Code ist das Problem gelöst:
If Not Kunde.IsEmailAdresse2Null() AndAlso Kunde.EmailAdresse2 <> "" Then
outZeile += Kunde.EmailAdresse2 & Feldtrenner
Else
outZeile += Feldtrenner
End If Trotzdem würde ich gerne verstehen warum der Fehler an der einen Stelle auftritt und an einer anderen, exakt gleichen, Stelle nicht.
Ich habe sogar die Zeilen beider Stellen untereinander kopiert, um sie zu vergleichen. Da ist nicht 1 Byte unterschiedlich.
Der einzige Unterschied ist, dass das DataSet auf der nachgeladenen Form von der Hauptform mit copy/paste kopiert ist und per Get/Set mit Daten versorgt wird. Kann das den Unterschied machen?
Lasse ich den ersten Teil der Bedingung weg, tritt der Fehler wieder auf.
Beitrag wurde zuletzt am 18.02.23 um 15:09:06 editiert. | |
Re: Wert einer Zelle in einem DataGridView prüfen | | | Autor: Manfred X | Datum: 18.02.23 17:47 |
| Hallo!
Die Methode Convert.IsDBNull ist relevant für Datenbankanwendungen und prüft,
ob ein Wert in einer angefragten Zelle fehlt.
Dazu wird in Der Dokumentation der folgende Hinweis gegeben:
Diese spezifische Kennung aus der Datenbankabfrage entspricht nicht Nothing oder String.Empty.
Daher gibt Code wie Convert.IsDBNull(Nothing) in Visual Basic false zurück.
Du mußt Dir darüber im klaren sein, was in der Zelle geprüft werden soll.
Nothing entspricht bei Werttypen gewöhnlich einem Wert, bei Objekten einer fehlenden Referenz.
String.Empty entspricht einem vorhandenen Zeichenfolgen-Objekt, das keine Zeichen enthält.
DBNull.Value entspricht einem fehlenden Wert in der Datenbank.
Wie Du Deine Tabelle kopierst, weiß ich nicht. Normalerweise gibt man eine Referenz der
abgefragten Tabelle an Formulare weiter, verwendet also jedes Tabellen-Objekt nur einmal
in der Anwendung. Kopien könnten das Update-Verfahren durcheinander bringen.
Die von Dir gefundene Ausnahme tritt auf, wenn in den abgefragten Daten fehlende Werte enthalten
sind. Das kann bei einer Abfrage-Bedingung der Fall sein, bei einer anderen aber nicht. | |
Re: Wert einer Zelle in einem DataGridView prüfen | | | Autor: Schudi | Datum: 18.02.23 18:48 |
| Hallo Manfred,
vielen Dank für die Antwort bzw. Erklärung.
Ja, es geht um "fehlende" Datenfelder. Wie gesagt, mit dem zuletzt geposteten Code klappt es.
Nur, um vielleicht doch noch herauszufinden, was ich falsch gemacht habe... Also ich bin wie folgt vorgegangen:
1) Dem Projekt ein neues Dataset hinzugefügt und im DataDesigner die Tabelle und die Spalten angelegt
2) Das DataSet per Copy/Paste von der Maske1 (FrmHaupt) nach Maske2 (FrmKunden) kopiert.
3) In der Hauptform wird die Untermaske wie folgt aufgerufen:
Dim _frmKunden As New FrmKunden With {.DSKunden = DSKunden}
_frmKunden.ShowDialog() 4) In der Untermaske die Property wie folgt definiert:
Public Property DSKundendaten As DSKunden
'DSKunden ist über den Designer (in der Form) angelegt
Get
Return DSKunden
End Get
Set(value As DSKunden)
DSKunden = value
End Set
End Property 5) Dann wird das Dataset über Eingabefelder mit Daten gefüllt, wobei einzelne Felder leer bleiben dürfen.
Der DefaultValue aller Felder ist, sofern mand as nicht im Designer ändert, standardmäßig <DBNUll>.
Daher haben alle nicht angegebenen Felder den Wert DBNull
6) Jetzt habe ich in beiden Formen einen Lauf durch alle Datensätze in - zunächst - dieser genau gleichen Form:
For Each Kunde As DSKunden.DTKundenRow In DSKunden.DTKunden.Rows
If Kunde.EmailAdresse2 <> "" Then
'Tu etwas
Else
'Tu was anderes
Next In FrmHaupt läuft der Code problemlos und er bringt auch die Daten der in frmKunden eingegebenen Kunden.
In FrmKunden wirft der Code den genannten "Wert ist DBNull" Error.
Mir ist jetzt gerade nur aufgefallen, dass beim Aufruf von _frmKunden auf DSKunden und nicht auf die Property DSKundendaten verwiesen wird. Ist das evtl. der Fehler? Der Code wurde von der IDE so verkürzt. Ursprünglich hatte ich alle Zeilen ausgeschrieben ohne "With".
Ich lasse den Code jetzt sowieso bei der gefundenen Lösung, weil ich meine, dass das die "korrekteste" Weise ist auf DBNull zu reagieren. Es muss ja einen Sinn haben, dass die IDE automatisch die Funktion Is'Column'Null zur Verfügung stellt bzw. generiert:
If Not Kunde.IsEmailAdresse2Null() AndAlso Kunde.EmailAdresse2 <> "" Then
outZeile += Kunde.EmailAdresse2 & Feldtrenner
Else
outZeile += Feldtrenner
End If | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevDTA 3.0 Pro
SEPA mit Kontonummernprüfung
Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|