vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Wert 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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Wert einer Zelle in einem DataGridView prüfen 
Autor: Kuno60
Datum: 14.02.23 22:15

benutze:
DGVKundendaten.CurrentCell.Value.ToString()
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel