Benutzer mit den meisten Antworten
ListBox.SelectedIndexChanged-Ereignis

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
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- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 30. März 2011 10:22
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
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Dienstag, 15. März 2011 14:24
- Nicht als Antwort vorgeschlagen Robert BreitenhoferModerator Mittwoch, 30. März 2011 10:22
-
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- Bearbeitet Robert BreitenhoferModerator Donnerstag, 17. März 2011 10:00 Formatierung
- Als Antwort markiert peter haus Freitag, 18. März 2011 10:14
- Tag als Antwort aufgehoben Thorsten DörflerModerator Mittwoch, 23. März 2011 14:24
-
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
-
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 -
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
-
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- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 30. März 2011 10:22