none
ListBox.SelectedIndexChanged-Ereignis RRS feed

  • Frage

  • Hallo

    Hoffenlich kann mir jemand weiterhelfen, ich sehe gerade kein Land mehr.

    Ich habe an ListBox.DataSource eine BindingSource gebunden.  

    Meine Frage ist, wenn ich an der zugrunde liegenden Tabelle, den Inhalt einer Row ändere (nicht ein Feld das in BindingSource.Filter verwendet wird), wird das ListBox.SelectedIndexChanged-Ereignis ausgelösst.

    Meine Frage ist.  Ist dieses Verhalten richtig?  Wenn ja. Lässt es sich "ausschalten"?

    Danke für Hilfe

    Peter

     

     

     


    Peter
    Freitag, 25. Februar 2011 13:10

Antworten

  • Hallo Robert,

    vielen Dank für Deine Antwort.

    Ich bin leider im Moment mit Problemen eingedeckt, sodass ich zu einem späteren Zeitpunkt, das oben genannte noch einmal anschauen muss. Im Moment habe ich vor dem Aufruf der (Detail)Form in der ein Datensatz geändert wird, eine Boolean Variable gesetzt die ich im ListBox.SelectedIndexChanged Event benutze, um über den Code zu springen, solange die (Detail)Form aktiv ist, in der Datensätze geändert werden. Da mit dem setzen von Suspendbinding, als auch .RaiseListChangedEvents = False, vor dem Aufruf der (Detail)Form, das ListBox.SelectedIndexChanged Event in der (Main)Form ausgelösst wurde, wenn in der (detail)Form ein Datensatz geändert wird.

    Herzlichen Dank.

    Gruss Peter

     


    Peter
    Mittwoch, 30. März 2011 08:57

Alle Antworten

  • Hallo peter Haus, 

    Meine Frage ist.  Ist dieses Verhalten richtig?  Wenn ja. Lässt es sich "ausschalten"?

    Wird etwas gemacht auf dem ListBox.SelectedIndexChanged-Ereignis?

    Du kannst es „ausschalten“ mit folgendem Code zum Beispiel:

    1)    Wir haben auf Form1 eine ListBox1 und eine CheckBox1

    2)    Wir haben DataSet1 mit DataTable1

    3)    DataTable1 mit Column1 als System.Int32 und Column2 als System.Boolean

    4)    BindingSource1 mit DataMember=DataTable1 und DataSource=DataSet1

    [VB.NET Code]

    Public Class Form1
      
        Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
            '// mal sehen wann das SelectedIndexChanged aufgerufen wird
            Debug.WriteLine("ListBox SelectedIndex geändert:" + Me.ListBox1.SelectedIndex.ToString())
      
        End Sub
      
        Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
            Debug.WriteLine("bevor CheckBox CheckedChanged")
      
            '// Daten werden geändert in der DataSource und ListBox wird neu bestückt und zeigt die neuen Daten an.
      
            RemoveHandler Me.ListBox1.SelectedIndexChanged, AddressOf ListBox1_SelectedIndexChanged
      
            DirectCast(DirectCast(DirectCast(Me.ListBox1.SelectedItem, System.Object), System.Data.DataRowView).Row, System.Data.DataRow).Item(1) = Me.CheckBox1.Checked
      
            AddHandler Me.ListBox1.SelectedIndexChanged, AddressOf ListBox1_SelectedIndexChanged
      
            Debug.WriteLine("nach CheckBox CheckedChanged")
      
        End Sub
      
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      
            Dim row As DataRow = Me.DataSet1.Tables("DataTable1").NewRow
            row(0) = 1
            row(1) = False
            Me.DataSet1.Tables("DataTable1").Rows.Add(row)
      
            row = Me.DataSet1.Tables("DataTable1").NewRow
            row(0) = 2
            row(1) = False
            Me.DataSet1.Tables("DataTable1").Rows.Add(row)
      
            row = Me.DataSet1.Tables("DataTable1").NewRow
            row(0) = 3
            row(1) = False
            Me.DataSet1.Tables("DataTable1").Rows.Add(row)
      
            Me.DataSet1.AcceptChanges()
      
        End Sub
      
    End Class

     

    *********************************************************************

    Also, wie man sieht, wenn man die folgenden Zeilen herausnehmt und im Debug à Windows à Immediate Window liest, ist das so “by Design“ (SelectedIndex wir geändert und laut ListBox.SelectedIndexChanged-Ereignis…das ListBox.SelectedIndexChanged-Ereignis tritt ein, wenn die SelectedIndex-Eigenschaft geändert wurde.

    Zeilen für ein/ausschalten des ListBox_SelectedIndexChanged-Erignis:

     

    RemoveHandler Me.ListBox1.SelectedIndexChanged, AddressOf ListBox1_SelectedIndexChanged
    AddHandler Me.ListBox1.SelectedIndexChanged, AddressOf ListBox1_SelectedIndexChanged

     

    Grüße,

    Robert

    Dienstag, 15. März 2011 14:22
    Moderator
  • Hallo Robert,

    vielen Dank für Deine ausführliche Antwort.

    Klar, RemoveHandler ist eine Möglichkeit.

    Allerdings frage ich mich auch, wieso habe ich damit keinen Erfolg?

    TabPersonalBindingSource.RaiseListChangedEvents = False (müsste ich hier den .GetRelatedCurrencyManager() benutzen?)

    oder TabPersonalBindingSource.SuspendBinding()

    Effekt: Keiner

    Gruss Peter


    Peter
    Donnerstag, 17. März 2011 09:51
  • Hallo Robert,

    vielen Dank für Deine ausführliche Antwort.

    Klar, RemoveHandler ist eine Möglichkeit.

    Allerdings frage ich mich auch, wieso habe ich damit keinen Erfolg?

    Hallo peter haus,

    Könntest Du Dein Problem inzwischen lösen? Du meinst dass mit RemoveHandler hast Du kein Erfolg gehabt?

    Im obigen Code den ich gepostet habe funktioniert dieser Mechanismus mit RemoveHanlder … AddHandler einwandfrei.

    Relevanter Code von Deiner Seite zu posten, wäre auch nicht schlecht.

    Danke und Grüße,

    Robert


    Mittwoch, 23. März 2011 13:55
    Moderator
  • Hallo Robert,

    da habe ich mich unklar ausgedrückt.

    Mit RemoveHandler ist die Anforderung zu erfüllen.

     

    Was mich wundert ist.

    Wenn ich TabPersonalBindingSource.RaiseListChangedEvents = False setze wird das Ereignis trotz dem ausgelösst.

    Wenn ich TabPersonalBindingSource.SuspendBinding() setze, hätte ich angenommen, das eine Änderung an einem Datensatz, ein an den Bindingsource gebundenes Control unbeeindruckt lässt. Dem ist auch nicht so.

    Gruss Peter

     


    Peter
    Mittwoch, 23. März 2011 15:20
  • Was mich wundert ist.

    Wenn ich TabPersonalBindingSource.RaiseListChangedEvents = False setze wird das Ereignis trotz dem ausgelösst.

    Wenn ich TabPersonalBindingSource.SuspendBinding() setze, hätte ich angenommen, das eine Änderung an einem Datensatz, ein an den Bindingsource gebundenes Control unbeeindruckt lässt. Dem ist auch nicht so.

    Hallo peter haus,

    „Mit SuspendBinding kann verhindert werden, dass Änderungen vor dem Aufruf von ResumeBinding in die Datenquelle geschoben werden. Es kann jedoch nicht verhindert werden, dass Ereignisse tatsächlich eintreten.

    Die Werte von Steuerelementen mit komplexer Datenbindung, z. B. des DataGridView-Steuerelements, werden basierend auf Änderungsereignissen aktualisiert, z. B. das ListChanged-Ereignis.

    Das Aufrufen von SuspendBinding verhindert daher nicht, dass sie an der Datenquelle vorgenommene Änderungen empfangen. Aus diesem Grund sind SuspendBinding und ResumeBinding für die Verwendung mit einfach gebundenen Steuerelementen vorgesehen, z. B. ein TextBox-Steuerelement.

    Diese Methoden können alternativ in einem komplexen Bindungsszenario verwendet werden, wenn ListChanged-Ereignisse durch Festlegen der RaiseListChangedEvents-Eigenschaft auf false unterdrückt werden.“

    …Hinweise aus der Quelle: BindingSource.SuspendBinding-Methode

    Grüße,

    Robert

    Donnerstag, 24. März 2011 12:04
    Moderator
  • Hallo peter haus,

    Könntest Du Dein Problem inzwischen lösen?

    Hat Dir die Antwort geholfen?

    Grüße,
    Robert

    Dienstag, 29. März 2011 07:26
    Moderator
  • Hallo Robert,

    vielen Dank für Deine Antwort.

    Ich bin leider im Moment mit Problemen eingedeckt, sodass ich zu einem späteren Zeitpunkt, das oben genannte noch einmal anschauen muss. Im Moment habe ich vor dem Aufruf der (Detail)Form in der ein Datensatz geändert wird, eine Boolean Variable gesetzt die ich im ListBox.SelectedIndexChanged Event benutze, um über den Code zu springen, solange die (Detail)Form aktiv ist, in der Datensätze geändert werden. Da mit dem setzen von Suspendbinding, als auch .RaiseListChangedEvents = False, vor dem Aufruf der (Detail)Form, das ListBox.SelectedIndexChanged Event in der (Main)Form ausgelösst wurde, wenn in der (detail)Form ein Datensatz geändert wird.

    Herzlichen Dank.

    Gruss Peter

     


    Peter
    Mittwoch, 30. März 2011 08:57