Announcement

Collapse
No announcement yet.

Probleme mit ListBox und/oder mit RowFilter

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit ListBox und/oder mit RowFilter

    Hallo,
    <p>
    folgende Ausgangssituation:
    <p>
    Ich habe eine Tabelle in einer MSDE und lade diese in eine DataTable in ein DataSet. Dabei füge ich der Tabelle noch eine DataColumn mit dem Namen <Selected> von Typ Boolean und dem DefaultValue = 'FALSE' zu.
    <p>
    Nun erstelle ich zwei DataView auf diese Tabelle und binde je ein DataView an eine Listbox:
    <BR><BR>
    Me.DataView1 = New DataView(Me.DataTable1)<BR>
    Me.DataView1.RowFilter = " Selected = 'TRUE' "<BR>
    Me.ListBox1.DataSource = Me.DataView1<BR>
    Me.ListBox1.ValueMember = "Id"<BR>
    Me.ListBox1.DisplayMember = "Name"<BR>
    <BR>
    Me.DataView2 = New DataView(Me.DataTable1)<BR>
    Me.DataView2.RowFilter = " Selected = 'False' "<BR>
    Me.ListBox2.DataSource = Me.DataView2<BR>
    Me.ListBox2.ValueMember = "Id"<BR>
    Me.ListBox2.DisplayMember = "Name"<BR>
    <BR>
    Soweit so gut.<BR>
    Auf Knopfdruck soll nun der markierte Eintrag aus der einen Listbox in die andere Listbox verschoben werden. In meinem Kontext bedeutet das, das der Wert <Selected> auf 'TRUE' gesetzt wird. Auf Grund des RowFilter des jeweiligen DataView sollte die DataRow mal in der einen oder in der anderen Listbox auftauchen.
    <BR><BR>
    Dim myGuid as System.Guid = Me.ListBox1.SelectedValue<BR>
    DataView1.Sort = "Id"<BR>
    Dim myRow As System.Int32 = DataView1.Find(myGuid)<BR>
    If myRow > -1 Then<BR>
    DataView1.Item(myRow)("Selected") = True<BR>
    End If<BR>
    DataView1.Sort = "Name"<BR>
    <BR>
    Auch dies funktioniert zumindest theoretisch, aber praktisch dann leider nicht mehr.
    <P>
    Das erste Problem das auftaucht ist, das diese DataRow nicht wie man es erwarten würde in der ListBox1 verschwindet und in der ListBox2 auftaucht. Erst nach wildem Klicken in den beiden Listboxen bequemt sich .Net, die Ansicht in den Listboxen zu aktualisieren. Allerdings taucht dann zwar die DataRow in ListBox2 auf, in der ListBox1 bleibt er jedoch auch bestehen.
    <P>
    Also alle Versuche mit Items.Clear() und neu füllen der Listbox bringen das gleiche schlechte Ergebnis. Auch ein ListBox1.Refresh() zeitigt kein anderes Ergebnis.
    <P>
    Nach dem ich dann mehrere DataRow auf diese Weise auf <Select> = 'TRUE' gesetzt habe verschwinden diese plötzlich wunschgemäss aus Listbox1 und werden dann in ListBox2 angezeigt. Aber warum nicht bei der ersten DataRow. Ausserdem verbleibt das Problem, das die Akualisierung der Listboxen immer erst nach wildem Klicken innerhalb der Listboxen erfolgt.
    <P>
    Es scheint mir irgendwie, als wäre es zufallsgesteuert, wie sich die Anzeige der Listboxen akualisiert.
    <P>
    Ziel des Ganzen ist es, aus der Ursprungstabelle einen oder mehrere Datensätze auszuwählen und dann weiterzuverarbeiten. Die Auswahl der zu verarbeitenden Datensätze erfolgt in der einen Listbox und durch verschieben in die andere Listbox werden sie zum Verarbeiten markiert und auch für den Benutzer sichtbar gemacht, welche Datensätze er den zur Verarbeitung ausgewählt hat. Gesteuert wird das letztlich über vier Buttons, die das Verschieben der Datensätze zwischen den beiden ListBoxes gestattet, nämlich '>', '>>', '<', '<<'.
    <P>
    Ich habe übrigens ein bischen den RowFilter im Verdacht. An einer anderen Stelle in meiner Applikation taucht ein ganz ähliches Problem auf. Dort ändere ich einen DataRow in einer DataTable1. An diese DataTable1 ist ein DatView 1 angebunden. An dieses DataView1 bindet sich ein DataGrid1.
    <BR><BR>
    Me.DataView1 = New DataView(Me.DataTable1)<BR>
    Me.DataGrid1.DataSource = Me.DataView1
    <BR><BR>
    Nun, was passiert nun, wenn ich einen Datensatz in DataTable1 ändere. In der DataGrid1 wird alles richtig angezeigt. Da ich aber sehr viele Datansätze in der DataTable1 habe, habe ich zusätzlich eine Filterfunktion eingebaut, mit der ich auf Knopdruck nur bestimmte Datensätze aus der DataView1 filtere.
    <BR><BR>
    Me.DataView1.RowFilter = " NOT Austritt IS NULL "
    <BR><BR>
    <Austritt> ist das Feld, das geändert wird. So, wie gesagt, die Änderung wird im DataGrid1 richtig angezeigt. Setze ich aber den RowFilter wie oben beschrieben, dann taucht der soeben geänderte Datensatz, dessen Feld <Austritt> eben nicht mehr NULL ist, nicht mehr in der DataGrid1 auf. Dort sehe ich dann nur noch die DataRows, die bereits vor dem letzten Laden der Daten aus der MSDE in die DataTable1 im Feld <Austritt> einen Wert ungleich NULL hatten.
    <P>
    Danke im voraus für Eure Hilfe<BR>
    Jan Heidrich
    <BR>

  • #2
    Hallo,
    <p>
    habe mein Problem selbst lösen können.
    <p>
    Und zwar schreibe ich niemals Änderungen aus dem DataSet in die Datenbank zurück. Dadurch kommt es niemals zu einem AcceptChanges(). Wenn ich AcceptChanges manuell ausführe, werden im DatGrid und auch in der Listbox alles korrekt angezeigt.
    <p>
    Gruss<br>
    Jan Heidric

    Comment

    Working...
    X