Suchen in einem DataGridView nach bestimmten Werten

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Suchen in einem DataGridView nach bestimmten Werten

    So eine letzte Frage hab ich noch. Und zwar wieder mal eine Lagerverwaltungsfrage:

    meine Form sieht (wie im Anhang zu sehen) so aus.

    Meine cmb´s befüll ich aus der Datenbank (SQL Server 2008 r2) das is ja alles mal kein problem.

    Meine datenbank sieht kurz erklärt so aus: ich habe eine Artikeltabelle (diese Attribute sind für alle Warengruppen gleich [Seriennummer][Lieferant]...). Pro Warengruppe habe ich dann spezielle Attribute (z.b. Desktop: Auflösung) in eigenen Tabelle. Die Artikeltabelle ist noch mit der Lieferantentabelle in verbindung. FK=LieferantenID

    Ich hätte es jetzt gerne so gemacht, dass je nachdem welche Informationen ich über die cmb´s Auswähle sich das DGV anpasst. Also wenn ich in "Lieferschein und Warengruppe" die Warengruppe Desktop auswähl soll es mir alle Attribute aus Artikel und die der Warengruppe Anzeigen. Wenn ich nun im Lieferschein noch die Nummer auswähle sollen nur die Artikel von Desktop angezeigt werden die dem Lieferschein angehören. (Lieferschein ist mit Lieferant in der Datenbank per FK "verknüpft". Und das selbe soll natürlich auch mit den "Suchen in Artikeldaten" funktionieren.

    Meine überlegung, dass ich nicht jedesmal eine neue Verbindung zur Datenbank aufbaue und sqlcommand rauswerf, sondern bei aufruf der Form ein Datatable(dataset) einmal befüll und dann darin suche ist glaube ich nicht so falsch. Aus der MSDN-Help über DGV bin ich jetzt nicht wirklich schlau geworden.
    Hoffe das mir jemand helfen kann ;)
    Bilder
    • Lager.png

      17,3 kB, 891×582, 415 mal angesehen
    Meine überlegung, dass ich nicht jedesmal eine neue Verbindung zur Datenbank aufbaue und sqlcommand rauswerf, sondern bei aufruf der Form ein Datatable(dataset) einmal befüll und dann darin suche ist glaube ich nicht so falsch.
    jo, das geht sehr schön mit typisiertem Dataset und DataExpressions
    ok dankeschön, schaut sehr nachdem aus was ich machen will.

    ich hab mir jetzt das msdn und deinen code angeschaut, nur entweder versteh ichs noch immer nicht, oder ich steh komplett auf der leitung.
    wie setz ich aber jetzt den DataTable als Source damit ich damit arbeiten kann?
    ich kann das nicht leiden wenn ich was nicht versteh ^^
    ja das steht schon alles mit DataSet, Table und DGV

    was mir kopfzerbrechen macht auf was wend ich den filter an?
    DGV oder Table? Nach meiner Überlegung auf den Table weil der ja die Source ist.
    also Table.Filter("select * where...") ?!
    hab das jetzt auf folgende art versucht... ich versteh das noch immer nicht ganz ...

    VB.NET-Quellcode

    1. connection.open()
    2. command = connection.CreateCommand
    3. command.CommandText = "Select * from Artikel, Kamer"
    4. Dim datasetall As New DataSet
    5. Dim datatableall As New DataTable
    6. Dim dataadapterall As New SqlDataAdapter
    7. dataadapterall.SelectCommand = command
    8. dataadapterall.Fill(datasetall, "Alle")
    9. datatableall = datasetall.Tables("Alle")
    10. datasetall.Tables("Alle").Select("ArtikelID=9")

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

    so ein "Gurken-Versuch" entsteht, wenn man versucht etwas hinzubekommen, wovon man nicht so viel Ahnung hat.

    leider kommt von dir immer nur als Hilfe "lies den post nochmal,...in post+6 schrieb ich BindingSources,..."
    aber auf meine Frage gehst du damit leider nicht ein. Kann mir den Post auch öfters durchlesen, aber wenn ich den Ansatz nicht versteh kann man den auch mal erklären und nicht immer einen Wortfetzen hinschreiben ;)

    Einen kompletten Code möcht ich ja so und so nicht haben, weil ich das Thema dann nicht versteh. Aber ein hilfreicher Ansatz wär mal nett. Ein Wort hilft nunmal nicht zur Erklärung.
    ja, ich kanns mir schenken, zu posten, wenn du die Sachen nicht liest.
    in post#8 fragichdich, ob du ühaupt BindingSources auf deinem Form hast, denn das wäre eine ansatzweise Erklärung dafür, dass du so tust, als hätte ich nie was von BindingSources geschrieben. Aber es geht numal mit BindingSources.

    So, und auf deine Frage gehe ich nicht ein - welche Frage bitte, war das nochmal?

    Die Frage in post#5 habe ich eindeutig beantwortet, und post#7 enthält gar keine Frage, sondern nur einen vollkommen unbrauchbaren Versuch - was soll ich dazu sagen, du sagst ja selbst: "funzt net".


    Ah - vmtl. hälst du eine allgemeine Aussage wie "... ich versteh das noch immer nicht ganz ..." für eine Frage, auf die man antworten kann.

    Tut mir leid. Ich kann versuchen, jeden Begriff, den du nennst, zu erklären, aber zu "das noch immer nicht ganz" kannman glaub prinzipiell keine erhellende Erläuterung geben.

    Ich bin sehr für Nachfragen, aber sone Frage muß auch etwas enthalten, wonach gefragt wird.

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

    ich glaub wir beide denken in die gleiche richtung, kommen aber durchs schreiben nicht zusammen ;) (also was man von wem erwartet)

    der codepost war insofern ein hilferuf ;)
    wie schon richtig erkannt ist kein bindingsources auf dem form drauf. bin aber grad am nachlesen und ausprobieren auf mein problem.
    also ich denk ich hab jetzt mal die BindingSource:

    VB.NET-Quellcode

    1. connection.Open()
    2. command5 = connection.CreateCommand
    3. command5.CommandText = "select * from Artikel, ArtikelStatus, ArtikelZustand, Warengruppen, Kamer, OrgEinheit"
    4. dataadapter.SelectCommand = command5
    5. dataadapter.Fill(dataset, "alles")
    6. datatable = dataset.Tables("alles")
    7. connection.Close()
    8. Dim dataview As DataView = New DataView(datatable)
    9. Dim BindingSource As BindingSource = New BindingSource
    10. dataview = datatable.DefaultView
    11. BindingSource.DataSource = dataview
    12. filter = " "
    13. dataview.RowFilter = filter
    14. DataGridView2.DataSource = BindingSource


    jetzt hab ich nur das problem, ohne Filter is das Ganze ein natürlicher Verbund (also jedes mit jedem), was ja falsch ist.
    es kommt allerdings nie vor, das kein Filter gesetzt ist. Aber auch wenn die ich den Filter auf ArtikelID=6 stelle bekommm ich einen natural Join.
    Meine Datenbank ist aber (wie ich es brav im studium gelernt habe auf nicht redunate Informationen aufgebaut).
    Ein Beispiel:
    In den Artikel Informationen steht drinnen,in welcher Organisationseinheit das Gerät eingepflegt ist. In der ArtikelTabelle ist jedoch nur die OrganisationseinheitID. Die Organisationseinheit steht in der OrgEinheit drinnen.
    Wenn ich jetzt davon ausgehe das die Bindingsource richtig ist, müsste ich ebenfalls abfragen, dass die Organisationseinheit aus der OrgEinheit Tabelle mit der gleichen ID ausgegeben wird. Mit SQL Befehlen wird ja dabei nicht gearbeitet.

    VB.NET-Quellcode

    1. filter="ArtikelStatus.ArtikelStatusID= Artikel.ArtikelStatusID"

    funktioniert natürlich wie beschrieben nicht.
    Wie kann ich nun auf die einzelnen Werte zugreifen um eine Korrekte ausgabe zu bekommen? z.b. möchte ich nach allen Artikel Filtern, die den Wert "NEU" im Zustand stehen haben. Wobei Zustand wieder die ID im Artikel gespeichert ist und der wirkliche Zustand eine referenz ist.

    sengsti schrieb:

    also ich denk ich hab jetzt mal die BindingSource:

    ist noch offen, ob du sie sinnvoll verwendest.

    nee, ich glaub eiglich nicht, denn BindingSources werden generiert, wenn man Tabellen aus dem Datenfenster aufs Form zieht, und dabei werden sie sinnvoll benannt.

    Keinesfalls erstellt man eine BindingSource im Code, oder weist einem DGV eine DataSource zu oder sowas.

    Das passiert alles im Designer, sodaß zur Laufzeit nur das Dataset zu befüllen ist, und im ganzen Code an keiner Stelle das Schlüsselwort "New" auftaucht (sicheres Zeichen dafür, dass man sich die im Designer getroffene Konfiguration zerschießt)

    Also um ein DatagridView per BindingSources an Tabellen eines Datasets zu binden (und letzteres zu befüllen) folge folgendem Tutorial: "Datenbank in 10 Minuten" auf Movie-Tuts

    Bitte alle meine Begriffe ganz genau nehmen, ohne Hinzufügungen, Abzüge oder Umstöpselungen:

    ein DGV wird per generierter BindingSource an eine Tabelle eines Datasets gebunden - dieses macht man mit wenigen Klicksen im Designer.

    Anschließend braucht man nur noch das Dataset befüllen - die Anzeige der Daten erfolgt dann automatisch.

    ZB. schreibe ich nirgends was von DataViews.
    okay werd mir das zur gemüte führen und dann hoffentlich die geschichte dahinter verstehen.
    das einzige was mich grad noch stutzig macht beim ersten durchmachen. Es wird hier die DBSample als Datenbankverbindung verwendet.
    meine datenbank liegt aber auf einem server, mit dem ich mich nicht so leicht connecten kann. kann nur per servername und DatenbankName darauf zugreifen. d.h. kann ich die datenbank nicht direkt öffnen so wie es VB braucht. gibts dann eine möglichkeit das Dataset richtig zu befüllen. Weil ja durch select * from (alle Tabellen) bekomm ich ja einen natural join.
    nach meiner Erfahrung kann man sich mit jeder Datenbank per ConnectionString connecten.
    Das macht für mich ühaupt die Idee des Connection-Objektes aus.

    Und zunächstmal mittm natural join zu arbeiten ist voll ok. Wenn du dich drauf einläßt, hast du allerlei Neuigkeiten zu lernen - das spezifizieren und Einschränken der abgterufenen Datenmengen kann man getrost zurückstellen, bis ühaupt mal was läuft.
    hehe nice ein weekend dazwischen und dann endlich verstanden.
    also die BindingSource wird nun laut Video erstellt.
    jetzt hab ich nur mehr das problem, ich hab ja in meiner ArtikelTabelle nur ID´s stehen (also z.b Mitarbeiter ID). Wenn ich nun einen Filter setz dann kommt auch immer nur die ID und nicht der Mitarbeitername. Kannst du mir da Syntaxmäßig noch bisl weiterhelfen? also kann ich in dem filter auf mehrere Tabellen zugreife wie im sql (select ArtikelID, Mitarbeiter from Artikel, Mitarbeiter where Artikel.MitarbeiterID=Mitarbeiter.MitarbeiterID)

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