Controllo di programmazione DataBound CheckListBox
-
09-10-2019 - |
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 ...?
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 ...