2009-05-18 33 views
8

Tengo un cuadro de lista de selección múltiple que estoy vinculando a un DataTable. DataTable contiene 2 columnas descripción y valor.Configuración del elemento seleccionado en un ListBox sin bucle

Aquí está el código poblar cuadro 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; 

me he fijado designación que el DisplayMember y valor que el ValueMember del 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 código de abajo (donde bucle a través de todos los elementos del 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 lo que falta/errónea en mi código. ¿Por qué es lb.SelectedValue = valuePassedByUser; seleccionando elementos incorrectos?

+0

¿Puede darnos más información sobre qué es exactamente lo que necesita hacer o un ejemplo más completo del código? ¿El objeto es leer un campo de una base de datos y establecer el índice/valor seleccionado en un valor coincidente en el cuadro de lista? – ryanulit

+0

El cuadro de lista se está completando con una DataTable que a su vez tiene datos recuperados de la base de datos. Mi preocupación es si he configurado el ValueMember mientras se completa la lista, ¿por qué lb.SelectedValue = valuePassedByUser; no funciona? –

Respuesta

7

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:

No se ordenaron los datos en la tabla de datos. Por lo tanto, I configuró la propiedad Sorted del 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. Así que si escribo:

lb.SelectedValue = valuePassedByUser;

se establece algún otro elemento seleccionado como lugar de settting aquel cuyo valor es valuePassedByUser. En resumen, se mete con los índices.

Por ej. si mis datos iniciales son:

Index ValueMember DisplayMember 
1   A   Apple 
2   M   Mango 
3   O   Orange 
4   B   Banana 

Y establecí sorted = true. A continuación, los elementos de cuadro de lista son:

Index ValueMember DisplayMember 
1   A   Apple 
2   B   Banana 
3   M   Mango 
4   O   Orange 

Ahora bien, si quiero establecer plátano como seleccionado, corro el stmt:

lb.SelectedValue = "B";

Pero en lugar de establecer plátano como seleccionado, se establece como naranja 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.

ahí que para cuadro de lista ordenada, 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; 
     } 
    } 
} 
0

Prueba esto: -

var listBox = c as ListBox; 
    var item = listBox.Items.FindByValue(fieldValue); 
    if (item != null) 
    listBox.SelectedValue = fieldValue; 
+2

No hay FindByValue en la colección Items. – norlando

1

Creo que la única forma en que será capaz de 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 que tendrá que usar:

var tempListBox = c As ListBox; 
if (tempListBox != null) 
    (tempListBox.SelectedItems.Add(tempListBox.Items[tempListBox.FindStringExact(fieldValue)]); 

También el FindStringExact no busca a través de los campos de valor que sólo se ve a través del texto que se muestra. 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.

0

Puede utilizar "FindByValue" de esta manera:

ListBox.SelectedIndex = ListBox.Items.IndexOf(ListBox.Items.FindByValue(fieldValue)) 
0
this.Character.SetSelected(this.Character.Items.IndexOf(this.textBox1.Text),true); 
0

Así es como he resuelto él, usando winforms, DotNet 4.6

listBox1.SelectedIndex = listBox1.FindString(stringInList); 
0

Si no desea el bucle para los elementos seleccionados, recupere el valor seleccionado del cuadro de lista del evento listBox_SelectedIndexChanged y añada ese valor en la matriz global. Luego, al acceder a ese conjunto, obtendría el valor deseado de los elementos seleccionados de itemlist sin ningún bucle.

Cuestiones relacionadas