Suchen in DataTable über Bindingsource - wie geht das ?

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Duke.

    Suchen in DataTable über Bindingsource - wie geht das ?

    Hi,
    ich bekomme das mit dem Suchen nicht hin:

    VB.NET-Quellcode

    1. Private m_dbWork As BindingSource = new BindingSource
    2. Private m_dtWork As DataTable = New DataTable
    3. m_dbWork.DataSource = m_dtWork
    4. dgData.DataSource = m_dbWork ' (dgData ist ein DataGridView)
    5. sqlString = "select Spalte0 from myTable"
    6. DBCon.Execute(sqlString, m_dtWork)
    7. m_dbWork.Find("Spalte0","ABC")


    Da kommt dann "System.ArgumentException - Die DataMember-Eigenschaft Spalte0 kann in der DataSource nicht gefunden werden."

    Was mache ich falsch ?
    Datatable ist natürlich gefüllt.

    Gruß, Duke

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Hi.

    Warum führst du die Suche nicht gleich in der Abfrage durch? Ich bin zwar kein SQL-Experte, aber die Abfrage dürfte doch so lauten:

    SQL-Abfrage

    1. SELECT Spalte0 FROM myTable WHERE Spalte0='ABC'

    Wenn die Abfrage nicht Nothing zurückgibt, ist der Wert vorhanden, sonst nicht.

    Die Find-Methode funktioniert auch, aber nur, wenn du in der DataTable Schemainformationen aus der DB geladen hast. Ist das nicht der Fall, findet die Methode die Spalte nicht, denn sie greift auf die genannten Angaben zurück. Wie du Schemainformationen abrufst, würde einige Buchseiten füllen - lies das bitte selbstständig nach. Gut erklärt ist das Ganze z.B. im openbook "Visual Basic 2005 - Das umfassende Handbuch". Die 2008er-Version enthält das sicherlich auch und ist leichter zu finden.
    Gruß
    hal2000
    Hi,

    die in der Tabelle enthaltenen Daten sind schon die, die ich benötige (where-Klausel)
    Ich arbeite mit den selektierten Daten aber interaktiv in einem DataGridView und da muss ich
    unter bestimmten Vorraussetzungen nach einen bestimmten Datensatz dieser Auswahl suchen können.

    Ich habe das Problem jetzt aber so lösen können, indem ich
    das das BindingSource-Objekt erst nach dem ersten Füllen der Datatable erzeuge:


    VB.NET-Quellcode

    1. DBCon.Execute(sqlString, m_dtWork)
    2. If m_dbWork is nothing Then
    3. m_dbWork = New BindingSource(m_dtWork, Nothing)
    4. End If
    5. ...


    Da es so geht, müssen die erforderlichen Informationen ja in der DataTable enthalten sein.
    Hast du eine Ahnung, warum das mit der Zuweisung der Datasource dann nicht ausreichend ist ?

    Gruß, Duke


    Edit :
    nur zum Verständnis

    VB.NET-Quellcode

    1. sqlString = "select Spalte0 from myTable"

    ist ein Standard-Platzhalter-Statement, dass ich als Platzhalter für mein
    ungleich komplexeres tatsächliches Statement hier angegeben habe ;)

    Duke schrieb:

    Hast du eine Ahnung, warum das mit der Zuweisung der Datasource dann nicht ausreichend ist ?

    Nicht direkt, aber ich vermute, dass der Fehler in der Art der Zuweisung liegt. Du erzeugst je ein leeres DataTable und BindingSource-Objekt. Die leere Tabelle bindest du an die DataSource-Eigenschaft der BindingSource, welche du wiederum an das DataGridView weiterleitest. In deinem letzten Post übergibst du das DataTable-Objekt, wenn es bereits gefüllt ist. Das ermöglicht dem BindingSource-Objekt, die DataMember-Eigenschaft dynamisch zu bestimmen, was ihm vorher nicht möglich war. Es müsste also helfen, die DataMember-Eigenschaft manuell anzugeben, wenn du eine leere Tabelle (wie in der ursprünglichen Fragestellung) übergibst.
    Das sind wie gesagt alles nur Vermutungen - für tiefergehende Analysen müsste ich selbst nachlesen. Letztlich gibt aber nur der Reflector hundertprozentig Aufschluss über die Abläufe. Teste nochmal deinen anfangs nicht funktionierenden Code mit der manuellen Festlegung der DataMember-Eigenschaft. Ich möchte wissen, ob meine Vermutung zutrifft :P .

    Hier noch ein MSDN-Link zur DataGridView.DataSource-Eigenschaft, wo ganz nützliche Informationen zu finden sind.
    msdn.microsoft.com/de-de/libra…atasource%28VS.80%29.aspx
    Gruß
    hal2000
    Hm, interessanterweise ist in beiden Fällen die DataMember-Eigenschaft = Nothing
    wenn ich mich recht erinnere. Kannst du mit dem Verhalten was anfangen ?

    Sicher kann ich das aber erst Montag bestätigen.

    Gruß, Duke

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Duke“ ()

    Duke schrieb:

    Hm, interessanterweise ist in beiden Fällen die DataMember-Eigenschaft = Nothing

    Der Reflector bestätigt das:

    VB.NET-Quellcode

    1. Public Sub New()
    2. Me.New(Nothing, String.Empty)
    3. End Sub

    Ich habe mir den Rest der Klasse mal angeschaut - da steigt keiner durch. Auf jeden Fall wird die ArgumentException ausgelöst, wenn eine Eigenschaft nicht gefunden wird. Dazu wird auf die Find-Methode einer Liste von Eigenschaften zurückgegriffen. Die Liste der Eigenschaften, in der gesucht wird, wird aber nicht von BindingSource selbst, sondern von einer PropertyDescriptorCollection in System.Component erstellt. Wie das alles zusammenhängt ist mir nicht ganz klar - wenn du willst kannst du der Ursache ja weiter hinterherforschen - ich würde es aufgrund der Komplexität gerne bei "es funktioniert jetzt" belassen :) .
    Gruß
    hal2000