Domanda

Ho un DataBound "CheckedListBox", ho bisogno di controllare alcune voci su di esso. Ho provato con seguente codice ...

if (!string.IsNullOrEmpty(search.Languages))
        {
            string[] langs = search.Languages.Split(',');
            for (int i = 0; i < (langs.Length - 1); i++)
            {
                for (int j = 0; j < clbLang.Items.Count; j++)
                {
                    string lng = clbLang.Items[j] as string;
                    if (lng.Trim() == langs[i])
                    {
                        clbLang.SetItemChecked(j, true);
                        break;
                    }
                }
            }
        }

Nessun errore, l'esecuzione debuged sta attraversando " controllare " processo, ma alla fine non riesco a vedere nulla verificato su di esso.

Poi ho aggiunto un pulsante e ha aggiunto seguente codice a esso. ( su Fare clic su Verifica tutte le voci )

private void button9_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < clbLang.Items.Count; i++)
        {
            clbLang.SetItemChecked(i, true);
        }
    }

E ' " controllare " tutte le voci, La prego di dirmi se qualcuno può vedere un problema qui ...?

È stato utile?

Soluzione

Infine ha scoperto, si tratta di un Bug introdotto da MS.

E 'ben spiegato qui.

  

Il problema è facile da riprodurre. Basta nascondere e mostrare un databound   CheckedListBox e si noterà come   gli elementi precedentemente controllato ottengono   incontrollato.

CheckedListBox metodo SetItemChecked non funzionante

Quindi dobbiamo trovare una soluzione ... ho provato follwing modo, è bello lavorare ...

Al posto in cui stavo chiamando controllare di elementi che ho aggiunto dopo ... io sono l'aggiunta di quello che mi serve per il check-in tag del controllo.

if (!string.IsNullOrEmpty(search.Languages))
{
    clbLang.Tag = search.Languages;
}

Poi, seguendo il codice in quella del controllo "VisibleChanged ()" evento.

private void clbLang_VisibleChanged(object sender, EventArgs e)
    {
        string lngs = clbLang.Tag as string;
        if (!string.IsNullOrEmpty(lngs))
        {
            string[] langs = lngs.Split(',');
            foreach (string lang in langs)
            {
                int j = 0;
                foreach (DataRowView row in clbLang.Items)
                {
                    if (row != null)
                    {
                        string lng = row[1] as string;
                        if (lng.Trim() == lang)
                        {
                            clbLang.SetItemChecked(j, true);
                            break;
                        }
                    }
                    j++;
                }
            }
        }
    }

Questo funziona bene con me, spero che andrà a beneficio ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top