Verhindern Sie, dass das selectedIndexChanged-Ereignis von comboBox ausgelöst wird, wenn das Formular geladen wird

75

Ich habe ein Formular mit einem ComboBox, das eine Dropdown-Liste enthält. Auf den ComboBoxen SelectedIndexChanged eventwird Code ausgeführt, aber ich möchte nicht, dass dieser Code ausgeführt wird, wenn das Formular geladen wird. Wenn ich das Formular lade (bevor ich eine Auswahl in der Combobox treffe), wird SelectedIndexChangeddie Combobox leider ausgelöst (ich denke, wenn die Combobox ist databinding). Gibt es eine Möglichkeit, ein solches Verhalten zu vermeiden?

StackTrace
quelle
Auf dem Desktop nicht sicher, aber in .NET Compact scheint dieses Ereignis tatsächlich vor dem Form_Load-Ereignis ausgelöst zu werden, was wirklich problematisch ist - es ist noch nichts im Formular eingerichtet, wenn dieser Code getroffen wird. Unter CF ist die Lösung leider eine Formularvariable, die am Ende des Ladens festgelegt wird. Anschließend überprüft der Ereignishandler diese Variable, bevor sie ausgelöst wird.
SqlRyan

Antworten:

147

Wenn Sie nur reagieren möchten, wenn der Benutzer das ausgewählte Element im Kombinationsfeld ändert, ist es besser, SelectionChangeCommitted zu abonnieren .

Schiedsrichter
quelle
6
Aber was tun bei Autocompete?
Arijit Mukherjee
@ Arjit Mukherjee richtig. Wenn Sie einen Wert in ein Textfeld eingeben, anstatt ihn direkt auszuwählen. Es wird kein SelectionChangeCommitted-Ereignis auslösen
thoitbk
Verdammt, ich habe eine ganze Weile im Internet gesucht, um eine einfache Lösung wie diese zu finden. Ich habe das SelectionChanged-Ereignis verwendet und es hat in VB.Net - WPF funktioniert und jetzt in C # - WinForms und es funktioniert nicht oder vielleicht bin es nur ich. Vielen Dank!
Stephan
Akams Razor - die einfachste Lösung ist die wahrscheinlichste (und in diesem Fall die beste).
Destek
13

Sie können das SelectedIndexChangedEreignis einfach aufheben , Ihre fillFunktion aufrufen und das SelectedIndexChangedEreignis erneut binden . Leider funktioniert dies nicht mit einem Raster.

Zum Beispiel:

this.cmb.SelectionChanged -= new System.EventHandler(this.cmb_SelectionChanged);
cmb.fill(); //Your function
this.cmb.SelectionChanged += new System.EventHandler(this.cmb_SelectionChanged);
Shantanu Gupta
quelle
6

Stellen Sie sicher, dass Sie die DataSourceEigenschaft in Ihrer onload()Funktion festlegen, nachdem Sie die Eigenschaften ValueMemberund Datamemberzugewiesen haben.

Dies wird Ihnen helfen, Ihr Problem zu lösen!

Ranjith
quelle
1
Bitte fügen Sie weitere Informationen hinzu, die Ihr Denken ausarbeiten.
Lenin
@ Ranjith: kannst du das näher erläutern?
Peter Mortensen
Löst das Problem. Danke, aber bitte näher erläutern.
Hubert17
Durch das Zuweisen einer neuen DataSource wird ein "selectedIndexChanged" -Ereignis ausgelöst.
John
5

Warum nicht eine booleanFlagge haben, die anzeigt, wann Sie Formdas Laden beendet haben?

SelectionChangedÜberprüfen Sie in Ihrem Fall, ob die booleanFlagge ist true. Wenn dies trueder Fall ist, behandeln Sie das Ereignis, andernfalls ignorieren Sie es.


quelle
2
booooooolean .. SelectionChangeCommitted viel schöner
Piotr Kula
3
Es gibt bereits ein boolesches Flag "Control.Created", das Ihnen mitteilt, dass das Laden des Formulars abgeschlossen ist. Dies gilt auch für Formulare.
user1734987
ToolStripComboBoxVariation hat kein SelectionChangeCommittedEreignis. Diese Methode muss also reichen. Oder Rennbedingungen, deren Nutzung zu verhindern lockund Monitor.TryEnter.
Spoulson
@ user1734987: Das ist nicht dasselbe. Möglicherweise muss der Initialisierungscode vervollständigt werden, und Control.Created löst dies nicht aus.
1

VB

RemoveHandler lbxNomes.SelectedIndexChanged, AddressOf lbxNomes_SelectedIndexChanged
lbxNomes.DataSource = dst
Label1.Text = String.Format("Encontrados {0} Sócios nesta pesquisa", dst.Rows.Count)
Label1.Visible = True
AddHandler lbxNomes.SelectedIndexChanged, AddressOf lbxNomes_SelectedIndexChanged
Paulos02
quelle
0

Hier ist eine einfache Lösung, die Ihren Code fast unberührt lässt:

Überprüfen Sie im SelectedIndexChanged-Ereignis, ob das myComboBox-Handle mit der Methode ( IsHandleCreated ) erstellt wurde. Eine weitere zusätzliche Überprüfung besteht darin, zu überprüfen, ob der Benutzer Ihr Combobox-Steuerelement tatsächlich fokussiert, um den ausgewählten Index zu ändern.

 private void myComboBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (myComboBox.IsHandleCreated &&  myComboBox.Focused)
        {
           // Do something here
        }
    }
Mohamed Nagieb
quelle
-1

Es hat bei mir in gewisser Weise mit dem folgenden Code funktioniert:

  private void ddlChapter_SelectionChangeCommitted(object sender, EventArgs e)
    {
        if (ddlChapter.SelectedValue != null)
        {
           // Do something here
        }
    }
Anjan Kant
quelle
SelectionChangeCommitted stoppt den Aufruf von Indexänderungselementen. Sobald alle Elemente in die Dropbox geladen wurden und Sie sie einzeln auswählen können, erhöht sich auch Ihre Ladegeschwindigkeit.
Anjan Kant