web-dev-qa-db-fra.com

Comment empêcher l'événement selectedindexchanged lorsque DataSource est lié?

J'ai le contrôle ComboBox (projet WinForm).

Lorsque je lie DataSource au contrôle ComboBox, l'événement combobox_selectedindexchanged est déclenché.

Avez-vous une idée de la façon d'éviter l'événement selectedindexchanged lorsque DataSource est lié?

14
Michael

Supprimez le gestionnaire de l'événement SelectedIndex_Changed, liez vos données, puis rajoutez le gestionnaire. Voici un exemple simple de la façon dont cela pourrait être effectué dans une méthode:

private void LoadYourComboBox()
{
    this.comboBox1.SelectedIndexChanged -= new EventHandler(comboBox1_SelectedIndexChanged);


        // Set your bindings here . . .


    this.comboBox1.SelectedIndexChanged += new EventHandler(comboBox1_SelectedIndexChanged);
}
34
XIVSolutions

Je sais que c’est un vieux message et qu’il a une réponse acceptée, mais je pense que nous pouvons utiliser SelectionChangeCommitted event comme solution pour éviter le déclenchement d’événements au cours de l’identification de données. 

L'événement SelectionChangeCommitted ne se déclenche que lorsque les utilisateurs modifient la sélection dans la liste déroulante.

il y a une question similaire sur SO et cette réponse est fournie par @arbiter.

18
shreesha

Utilisez SelectionChangeCommitted Event au lieu de 'SelectedIndexChanged'

SelectionChangeCommitted n'est déclenché que lorsque l'utilisateur modifie la sélection de la liste déroulante . N'utilisez pas SelectedIndexChanged ou SelectedValueChanged pour capturer les modifications apportées par l'utilisateur, car ces événements sont Également générés lorsque la sélection est modifiée par programme.

FROM https://msdn.Microsoft.com/en-us/library/system.windows.forms.combobox.selectionchangecommitted.aspx

3
Arpit Shrivastava

Ne pensez pas que vous pouvez arrêter l'événement, mais vous ne pouvez pas le gérer.

Détachez le (s) gestionnaire (s) d'événements, liez, puis attachez le (s) gestionnaire (s) d'événements.

2
paparazzo

Voici un moyen simple. Vous pouvez utiliser la propriété Tag de la liste déroulante. Elle peut être vide ou être une valeur entière 0 lorsqu'elle est vide ou non remplie. Vous devez définir la balise de la liste déroulante comme nombre d'éléments après la liaison. Dans l'événement SelectedValueChanged, si la propriété de la balise est null ou 0, vous devez revenir à néant.

Voici quelques exemples de mon projet.

private void cb_SelectedValueChanged(object sender, EventArgs e)
{
    if (!(sender is ComboBox)) return;
    ComboBox cb = sender as ComboBox;
    if (DataUtils.ToInt(cb.Tag, 0) == 0) return;
    if (cbSmk.SelectedValue == null ) return;
    /* Continue working;  */
}

public static void ComboboxFill(ComboBox cb, string keyfld, string displayfld, string sql)
{          
    try
    {
        cb.Tag = 0;
        cb.DataSource = null;
        cb.Items.Clear();

        DataSet ds = DataMgr.GetDsBySql(sql);
        if (!DataUtils.HasDtWithRecNoErr(ds))
        {                    
            cb.Text = "No data";
        }
        else
        {
            cb.DataSource = ds.Tables[0];
            cb.DisplayMember = displayfld;
            cb.ValueMember = keyfld;
        }
        cb.Tag = cb.Items.Count;
    }
    catch (Exception ex)
    {
        Int32 len = ex.Message.Length > 200 ? 200 : ex.Message.Length;
        cb.Text = ex.Message.Substring(0, len);
    }                
}

CmpHelper.ComboboxFill(cbUser, "USER_ID", "USER_NAME", "SELECT * FROM SP_USER WHERE 1=1 ORDER by 1",-1);
0
Rasulbek