c# - recorrer - Establecer el elemento seleccionado en un ListBox sin bucles
recorrer listbox c# (7)
Tengo un listbox de selección múltiple que estoy vinculando a una DataTable. DataTable contiene 2 columnas descripción y valor.
Aquí está el código de población de lista de lista:
DataTable copytable = null;
copytable = GlobalTable.Copy(); // GlobalTable is a DataTable
copytable.Rows[0][0] = "--ALL--";
copytable.Rows[0][1] = "--ALL--";
breakTypeList.DataSource = copytable;
this.breakTypeList.DisplayMember = copytable.Columns[0].ColumnName; // description
this.breakTypeList.ValueMember = copytable.Columns[1].ColumnName; // value
this.breakTypeList.SelectedIndex = -1;
Estoy configurando la descripción como DisplayMember y valor como el ValueMember de ListBox. Ahora, dependiendo de lo que se pase el valor, necesito configurar el elemento seleccionado en el ListBox.
Aquí está mi código:
ListBox lb = c as ListBox;
lb.SelectedValue = valuePassedByUser;
que no está funcionando. Por lo tanto, tengo que recurrir al siguiente código (donde recorro todos los elementos en el cuadro de lista)
for (int i = 0; i < lb.Items.Count; i++)
{
DataRowView dr = lb.Items[i] as DataRowView;
if (dr["value"].ToString() == valuePassedByUser)
{
lb.SelectedIndices.Add(i);
break;
}
}
Me gustaría saber qué es lo que falta / erróneo en mi código. ¿Por qué es lb.SelectedValue = valuePassedByUser; seleccionando elementos incorrectos?
Así es como lo resolví, usando winforms, DotNet 4.6
listBox1.SelectedIndex = listBox1.FindString(stringInList);
Creo que la única forma en que podrá seleccionar varios elementos es mediante el uso de un bucle foreach. La propiedad SelectedValue solo parece devolver 1 artículo. Si desea seleccionar más de 1 elemento, deberá usar:
var tempListBox = c As ListBox;
if (tempListBox != null)
(tempListBox.SelectedItems.Add(tempListBox.Items[tempListBox.FindStringExact(fieldValue)]);
Además, FindStringExact no busca a través de los campos de valor solo se ve a través del texto mostrado. Además, para reducir el código, es posible que desee emitir una nueva variable como un cuadro de lista para que no continúe emitiendo C como un cuadro de lista.
Ok ... aquí viene una respuesta difícil de digerir que me di cuenta ayer. Sin embargo, es mi error que no mencioné una cosa importante en mi pregunta porque sentí que es irrelevante para el problema en cuestión:
Los datos en la tabla de datos no fueron ordenados. Por lo tanto, establecí la propiedad Sorted de listbox en true . Más tarde me di cuenta de que cuando la propiedad clasificada del cuadro de lista o incluso del cuadro combinado se establece en verdadero, entonces el miembro de valor no se establece correctamente. Entonces si escribo:
lb.SelectedValue = valuePassedByUser;
establece algún otro elemento como seleccionado en lugar de establecer el cuyo Valor es valuePassedByUser. En resumen, se mete con los índices.
Por ejemplo, si mis datos iniciales son:
Index ValueMember DisplayMember
1 A Apple
2 M Mango
3 O Orange
4 B Banana
Y establecí Sorted = true. Entonces los elementos del cuadro de lista son:
Index ValueMember DisplayMember
1 A Apple
2 B Banana
3 M Mango
4 O Orange
Ahora si quiero configurar Banana como seleccionado, ejecuto el stmt:
lb.SelectedValue = "B";
Pero en lugar de configurar Banana como seleccionado, establece Naranja como seleccionado. ¿Por qué? Como no se había ordenado la lista, el índice de Banana sería 4. Por lo tanto, aunque después de ordenar el índice de Banana es 2, establece el índice 4 como seleccionado, lo que hace que se seleccione a Orange en lugar de Banana.
Por lo tanto, para el cuadro de lista ordenado, estoy usando el siguiente código para establecer los elementos seleccionados:
private void SetSelectedBreakType(ListBox lb, string value)
{
for (int i = 0; i < lb.Items.Count; i++)
{
DataRowView dr = lb.Items[i] as DataRowView;
if (dr["value"].ToString() == value)
{
lb.SelectedIndices.Add(i);
break;
}
}
}
Prueba esto:-
var listBox = c as ListBox;
var item = listBox.Items.FindByValue(fieldValue);
if (item != null)
listBox.SelectedValue = fieldValue;
Puede usar "FindByValue" de esta manera:
ListBox.SelectedIndex = ListBox.Items.IndexOf(ListBox.Items.FindByValue(fieldValue))
Si no desea el bucle de los elementos seleccionados, recupere el valor seleccionado del cuadro de lista del evento listBox_SelectedIndexChanged
y añada ese valor en el conjunto global. Luego, al acceder a esa matriz, obtendría el valor deseado de los elementos seleccionados de la lista de artículos sin ningún bucle.
this.Character.SetSelected(this.Character.Items.IndexOf(this.textBox1.Text),true);