2010-11-08 20 views
5

¿Es posible ejecutar a través de cada elemento en un cuadro combinado utilizando un bucle foreach? ¿Cómo lo haría?C# bucle a través del cuadro combinado donde datasource es una tabla de datos con texto

La cosa es que tengo un System.Data.DataRowView allí porque el combobox está conectado a un DataTable. ¿Cómo puedo convertir eso a string?

+0

¿Estás haciendo esto para buscar un valor específico en el cuadro combinado? relacionado con tu última pregunta? –

Respuesta

15

En general, parece que esto:

foreach(object item in myComboBox.Items) 
{ 
    DataRowView row = item as DataRowView; 

    if(row != null) 
    { 
     string displayValue = row["myColumnName"].ToString(); 

     // do something 
    } 
    else 
     // error: item was not of type DataRowView 
} 

también ver http://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.items.aspx

+0

gracias, ¿cómo me gustaría obtener el item.text? –

+0

item.ToString() le dará el valor que se muestra en el cuadro combinado para ese elemento específico. – Remus

+0

@ soy una niña, si estás buscando un artículo con texto específico, hay un método para eso. –

3
foreach (var item in combobox1.Items) 
{ 
    //do stuff 
} 

Si conoce el contenido es una cadena, se puede hacer

foreach (object item in combobox1.Items) 
{ 
    string text = (item as string); 
    //do stuff with the text 
} 

Si está Usando .net 3.5 o posterior, puede acortarlo un poco usando el método de extensión Cast<T>() de IEnumerable<T> (que se realiza mediante ObjectCollection, el tipo de ComboBox.Items):

foreach (string text in combobox1.Items.Cast<string>()) 
{ 
    //do stuff with the text 
} 
+0

gracias, ¿cómo me gustaría obtener el item.text? –

+0

muchas gracias, lo que pasa es que tengo 'System.Data.DataRowView' porque el combobox está conectado a la tabla de datos, ¿cómo convierto a frmo a la cadena –

+0

? Necesitará conocer el índice específico de los datos que se muestran en el cuadro combinado y elemento de llamada [índice]. Lo siento, no puedo ayudarte más porque no tengo experiencia en Databinding in WinForms. – Femaref

0

sí - iterar a través de la colección de elementos del control:

foreach(var item in this.myCombobox.Items) 
{ 
    //your code 
} 
+0

gracias, ¿cómo me gustaría obtener el item.text? –

+0

es esencialmente el valor de item.ToString() – dexter

+0

muchas gracias, lo que pasa es que tengo 'System.Data.DataRowView' porque el combobox está conectado a la tabla de datos, ¿cómo convierto frmo a la cadena –

0
foreach(ListItem item in this.myCombobox.Items) 
{ 
    //... 
} 
0
foreach(object item in ComboBoxName.Items) 
{ 
    <dosomething> 
} 

¿Qué más puedo decir? ? Esto accede a ellos en orden, pero todos serán objetos. Depende de usted determinar el tipo de elemento.

1

Sí, es simplemente una colección estándar. Por ejemplo:

foreach(object item in myComboBox.Items) 

"objeto" es probablemente (pero no necesariamente) una cadena. Si usted sabe que siempre es una cadena, puede cambiarlo a:

foreach(string item in myComboBox.Items) 
+1

el segundo código ganado No funciona, ya que myCombobox.Items es una colección de objetos. – Femaref

2

Basado en su previous question, parece que desea recorrer los elementos para encontrar un valor de texto coincidente. En su lugar, puede utilizar el método ComboBox.FindStringExact hacer una búsqueda sensible a las mayúsculas, que devolverá el índice del primer partido que encuentra, o -1 si no se encuentra el texto en cuestión:

comboBox1.SelectedIndex = comboBox1.FindStringExact("4"); 
0

I Ha luchado durante mucho tiempo con este problema, ya que a menudo uso controles ComboBox, en una Lista <> s de varias clases diferentes.

Realmente no quería codificar nombres de campo en mi función, o tener una función SelectItemByValue por separado para cada tipo de lista <> clase que estaría usando.

Al final se me ocurrió la siguiente solución reutilizable.

List<EmployeeRecord> m_listOfEmployees = GetListOfEmployees(); 
... 
comboBoxEmployees.DataSource = m_listOfEmployees; 
comboBoxEmployees.DisplayMember = "EmployeeName"; 
comboBoxEmployees.ValueMember = "EmployeeID"; 

para seleccionar el elemento ComboBox con un ID de empleado en particular:

int someEmployeeID = 4; 
    ComboBoxHelper.SetComboBoxSelectionByValue<EmployeeRecord>(comboBoxEmployees, someEmployeeID); 

Y aquí es la función que realiza el trabajo.

Prepárate, no es bonito.

public static void SetComboBoxSelectionByValue<T>(ComboBox ctrl, int? value) 
{ 
    // If the ComboBox has no items, disable it (so the user can immediately see there's nothing selectable) 
    ctrl.Enabled = (ctrl.Items.Count > 0); 

    int inx = 0; 
    foreach (T t in ctrl.Items) 
    { 
     foreach (PropertyInfo info in typeof(T).GetProperties()) 
     { 
      if (info.Name == ctrl.ValueMember) 
      { 
       object val = info.GetValue(t, null); 
       if (val.ToString() == value.Value.ToString()) 
       { 
        ctrl.SelectedIndex = inx; 
        return; 
       } 
      } 
     } 
     inx++; 
    } 

    if (ctrl.Items.Count > 0) 
     ctrl.SelectedIndex = 0; 
} 

Aviso cómo hay que llamar a la función, pasándole el tipo de objetos que se están almacenando en cada ComboBoxItem (EmployeeRecord, en este ejemplo), junto con un puntero a su cuadro combinado y la Valor del elemento que desea establecer como SelectedItem.

ComboBoxHelper.SetComboBoxSelectionByValue<EmployeeRecord>(comboBoxEmployees, someEmployeeID); 

La función de los pasos a través de los elementos en el cuadro combinado, se encuentra el campo "ValueMember" en el registro de ese elemento (de empleado, en este ejemplo) y compara el valor de la ValueMember con el parámetro deseado valor.

Lo sé, lo sé, no es bonito, pero cuando se enlaza una lista a un cuadro combinado, entonces no se puede utilizar DataRowView:

DataRowView row = item as DataRowView; 
string displayValue = row["someColumnName"].ToString(); 

Y si quieres una función SetComboBoxSelectionByValue genérica, que se trabaje con listas de cualquier tipo de clases, luego debe comenzar a entrar en PropertyInfos, para encontrar el valor de un campo en su clase particular.

Cuestiones relacionadas