seleccionado - llenar combobox c# windows forms
ComboBox: agregar texto y valor a un elemento(sin fuente de enlace) (20)
Además de la respuesta de Adam Markowitz, aquí hay una forma de propósito general de (relativamente) simplemente establecer los valores de ItemSource
de un cuadro combinado para que sean enums
, mientras se muestra el atributo ''Descripción'' para el usuario. (Uno pensaría que todos querrían hacer esto para que sea un trazador .NET one, pero simplemente no lo es, y esta es la forma más elegante que he encontrado).
Primero, crea esta clase simple para convertir cualquier valor Enum en un elemento ComboBox:
public class ComboEnumItem {
public string Text { get; set; }
public object Value { get; set; }
public ComboEnumItem(Enum originalEnum)
{
this.Value = originalEnum;
this.Text = this.ToString();
}
public string ToString()
{
FieldInfo field = Value.GetType().GetField(Value.ToString());
DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
return attribute == null ? Value.ToString() : attribute.Description;
}
}
En segundo lugar, en su OnLoad
eventos OnLoad
, necesita establecer el origen de su cuadro combinado para que sea una lista de ComboEnumItems
basada en cada Enum
en su tipo Enum
. Esto se puede lograr con Linq. Luego, simplemente configure DisplayMemberPath
:
void OnLoad(object sender, RoutedEventArgs e)
{
comboBoxUserReadable.ItemsSource = Enum.GetValues(typeof(EMyEnum))
.Cast<EMyEnum>()
.Select(v => new ComboEnumItem(v))
.ToList();
comboBoxUserReadable.DisplayMemberPath = "Text";
comboBoxUserReadable.SelectedValuePath= "Value";
}
Ahora el usuario seleccionará una lista de sus Descriptions
fáciles de usar, pero lo que seleccione será el valor enum
que puede usar en el código. Para acceder a la selección del usuario en el código, comboBoxUserReadable.SelectedItem
será ComboEnumItem
y comboBoxUserReadable.SelectedValue
será el EMyEnum
.
En C # WinApp, ¿cómo puedo agregar texto y valor a los elementos de mi ComboBox? Hice una búsqueda y usualmente las respuestas están usando "Encuadernación a una fuente" ... pero en mi caso no tengo una fuente de encuadernación lista en mi programa ... ¿Cómo puedo hacer algo como esto?
combo1.Item[1] = "DisplayText";
combo1.Item[1].Value = "useful Value"
Así es como lo hace Visual Studio 2013:
Objeto unico:
comboBox1->Items->AddRange(gcnew cli::array< System::Object^ >(1) { L"Combo Item 1" });
Artículos Múltiples:
comboBox1->Items->AddRange(gcnew cli::array< System::Object^ >(3)
{
L"Combo Item 1",
L"Combo Item 2",
L"Combo Item 3"
});
No es necesario hacer anulaciones de clases o incluir cualquier otra cosa. Y sí, las comboBox1->SelectedItem
y comboBox1->SelectedIndex
siguen funcionando.
Clase creat:
namespace WindowsFormsApplication1
{
class select
{
public string Text { get; set; }
public string Value { get; set; }
}
}
Códigos Form1:
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
List<select> sl = new List<select>();
sl.Add(new select() { Text = "", Value = "" });
sl.Add(new select() { Text = "AAA", Value = "aa" });
sl.Add(new select() { Text = "BBB", Value = "bb" });
comboBox1.DataSource = sl;
comboBox1.DisplayMember = "Text";
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
select sl1 = comboBox1.SelectedItem as select;
t1.Text = Convert.ToString(sl1.Value);
}
}
}
Debe crear su propio tipo de clase y anular el método ToString () para devolver el texto que desea. Aquí hay un ejemplo simple de una clase que puede usar:
public class ComboboxItem
{
public string Text { get; set; }
public object Value { get; set; }
public override string ToString()
{
return Text;
}
}
El siguiente es un ejemplo simple de su uso:
private void Test()
{
ComboboxItem item = new ComboboxItem();
item.Text = "Item text1";
item.Value = 12;
comboBox1.Items.Add(item);
comboBox1.SelectedIndex = 0;
MessageBox.Show((comboBox1.SelectedItem as ComboboxItem).Value.ToString());
}
Debe usar dynamic
objeto dynamic
para resolver el elemento del cuadro combinado en tiempo de ejecución.
comboBox.DisplayMember = "Text";
comboBox.ValueMember = "Value";
comboBox.Items.Add(new { Text = "Text", Value = "Value" });
(comboBox.SelectedItem as dynamic).Value
Esta es una de las formas que me vino a la mente:
combo1.Items.Add(new ListItem("Text", "Value"))
Y para cambiar el texto o el valor de un artículo, puede hacerlo así:
combo1.Items[0].Text = ''new Text'';
combo1.Items[0].Value = ''new Value'';
No existe una clase llamada ListItem en Windows Forms . Solo existe en ASP.NET , por lo que tendrá que escribir su propia clase antes de usarla, al igual que lo hizo @Adam Markowitz en su respuesta .
También consulte estas páginas, pueden ayudar:
Esta es una solución muy simple para formularios de Windows si todo lo que se necesita es el valor final como una (cadena). Los nombres de los elementos se mostrarán en el cuadro combinado y el valor seleccionado se puede comparar fácilmente.
List<string> items = new List<string>();
// populate list with test strings
for (int i = 0; i < 100; i++)
items.Add(i.ToString());
// set data source
testComboBox.DataSource = items;
y en el controlador de eventos obtenga el valor (cadena) del valor seleccionado
string test = testComboBox.SelectedValue.ToString();
Esto es similar a algunas de las otras respuestas, pero es compacto y evita la conversión al diccionario si ya tiene una lista.
Dado un "cuadro combinado" de ComboBox
en un formulario de Windows y una clase SomeClass
con el Name
propiedad de tipo de string
,
List<SomeClass> list = new List<SomeClass>();
combobox.DisplayMember = "Name";
combobox.DataSource = list;
Lo que significa que SelectedItem es un objeto SomeClass
de la list
, y cada elemento en el combobox
se mostrará con su nombre.
Me gustó la respuesta de Fab pero no quería usar un diccionario para mi situación, así que sustituí una lista de tuplas.
// set up your data
public static List<Tuple<string, string>> List = new List<Tuple<string, string>>
{
new Tuple<string, string>("Item1", "Item2")
}
// bind to the combo box
comboBox.DataSource = new BindingSource(List, null);
comboBox.ValueMember = "Item1";
comboBox.DisplayMember = "Item2";
//Get selected value
string value = ((Tuple<string, string>)queryList.SelectedItem).Item1;
Mejor solución aquí;
Dictionary<int, string> userListDictionary = new Dictionary<int, string>();
foreach (var user in users)
{
userListDictionary.Add(user.Id,user.Name);
}
cmbUser.DataSource = new BindingSource(userListDictionary, null);
cmbUser.DisplayMember = "Value";
cmbUser.ValueMember = "Key";
Retreive Data
MessageBox.Show(cmbUser.SelectedValue.ToString());
No sé si esto funcionará para la situación dada en la publicación original (sin importar el hecho de que esto es dos años más tarde), pero este ejemplo funciona para mí:
Hashtable htImageTypes = new Hashtable();
htImageTypes.Add("JPEG", "*.jpg");
htImageTypes.Add("GIF", "*.gif");
htImageTypes.Add("BMP", "*.bmp");
foreach (DictionaryEntry ImageType in htImageTypes)
{
cmbImageType.Items.Add(ImageType);
}
cmbImageType.DisplayMember = "key";
cmbImageType.ValueMember = "value";
Para volver a leer su valor, tendrá que convertir la propiedad SelectedItem en un objeto DictionaryEntry, y luego puede evaluar las propiedades Key y Value de eso. Por ejemplo:
DictionaryEntry deImgType = (DictionaryEntry)cmbImageType.SelectedItem;
MessageBox.Show(deImgType.Key + ": " + deImgType.Value);
Puede usar Dictionary
Object en lugar de crear una clase personalizada para agregar texto y valor en un Combobox
.
Agregue claves y valores en un objeto de Dictionary
:
Dictionary<string, string> comboSource = new Dictionary<string, string>();
comboSource.Add("1", "Sunday");
comboSource.Add("2", "Monday");
Enlace el objeto de diccionario de origen a Combobox
:
comboBox1.DataSource = new BindingSource(comboSource, null);
comboBox1.DisplayMember = "Value";
comboBox1.ValueMember = "Key";
Recuperar clave y valor:
string key = ((KeyValuePair<string,string>)comboBox1.SelectedItem).Key;
string value = ((KeyValuePair<string,string>)comboBox1.SelectedItem).Value;
Fuente Completa: Texto ComboBox nd Valor
Puede usar este elemento de adición de combox de código con texto y su valor
private void ComboBox_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
{
combox.Items.Insert(0, "Copenhagen");
combox.Items.Insert(1, "Tokyo");
combox.Items.Insert(2, "Japan");
combox.Items.Insert(0, "India");
}
para insertar algunos elementos en la combox con texto y valor. y aquí está su código xaml para combox
Puede usar un tipo genérico:
public class ComboBoxItem<T>
{
private string Text { get; set; }
public T Value { get; set; }
public override string ToString()
{
return Text;
}
public ComboBoxItem(string text, T value)
{
Text = text;
Value = value;
}
}
Ejemplo de uso de un simple int-Type:
private void Fill(ComboBox comboBox)
{
comboBox.Items.Clear();
object[] list =
{
new ComboBoxItem<int>("Architekt", 1),
new ComboBoxItem<int>("Bauträger", 2),
new ComboBoxItem<int>("Fachbetrieb/Installateur", 3),
new ComboBoxItem<int>("GC-Haus", 5),
new ComboBoxItem<int>("Ingenieur-/Planungsbüro", 9),
new ComboBoxItem<int>("Wowi", 17),
new ComboBoxItem<int>("Endverbraucher", 19)
};
comboBox.Items.AddRange(list);
}
Puedes usar una clase anónima como esta:
comboBox.DisplayMember = "Text";
comboBox.ValueMember = "Value";
comboBox.Items.Add(new { Text = "report A", Value = "reportA" });
comboBox.Items.Add(new { Text = "report B", Value = "reportB" });
comboBox.Items.Add(new { Text = "report C", Value = "reportC" });
comboBox.Items.Add(new { Text = "report D", Value = "reportD" });
comboBox.Items.Add(new { Text = "report E", Value = "reportE" });
ACTUALIZACIÓN: aunque el código anterior se mostrará correctamente en el cuadro combinado, no podrá usar las propiedades SelectedValue
o SelectedText
de ComboBox
. Para poder utilizarlos, vincula el cuadro combinado de la siguiente manera:
comboBox.DisplayMember = "Text";
comboBox.ValueMember = "Value";
var items = new[] {
new { Text = "report A", Value = "reportA" },
new { Text = "report B", Value = "reportB" },
new { Text = "report C", Value = "reportC" },
new { Text = "report D", Value = "reportD" },
new { Text = "report E", Value = "reportE" }
};
comboBox.DataSource = items;
Si alguien todavía está interesado en esto, aquí hay una clase simple y flexible para un elemento del cuadro combinado con un texto y un valor de cualquier tipo (muy similar al ejemplo de Adam Markowitz):
public class ComboBoxItem<T>
{
public string Name;
public T value = default(T);
public ComboBoxItem(string Name, T value)
{
this.Name = Name;
this.value = value;
}
public override string ToString()
{
return Name;
}
}
Usar la <T>
es mejor que declarar el value
como un object
, ya que con el object
, entonces debes hacer un seguimiento del tipo que usaste para cada elemento, y echarlo en tu código para usarlo correctamente.
Lo he estado utilizando en mis proyectos desde hace bastante tiempo. Es realmente útil.
Tuve el mismo problema, lo que hice fue agregar un nuevo ComboBox
con solo el valor en el mismo índice que en el primero, y luego cuando cambié el combo principal, el índice en el segundo cambio al mismo tiempo, luego tomé el valor del segundo combo y utilícelo.
Este es el código:
public Form1()
{
eventos = cliente.GetEventsTypes(usuario);
foreach (EventNo no in eventos)
{
cboEventos.Items.Add(no.eventno.ToString() + "--" +no.description.ToString());
cboEventos2.Items.Add(no.eventno.ToString());
}
}
private void lista_SelectedIndexChanged(object sender, EventArgs e)
{
lista2.Items.Add(lista.SelectedItem.ToString());
}
private void cboEventos_SelectedIndexChanged(object sender, EventArgs e)
{
cboEventos2.SelectedIndex = cboEventos.SelectedIndex;
}
Un ejemplo usando DataTable:
DataTable dtblDataSource = new DataTable();
dtblDataSource.Columns.Add("DisplayMember");
dtblDataSource.Columns.Add("ValueMember");
dtblDataSource.Columns.Add("AdditionalInfo");
dtblDataSource.Rows.Add("Item 1", 1, "something useful 1");
dtblDataSource.Rows.Add("Item 2", 2, "something useful 2");
dtblDataSource.Rows.Add("Item 3", 3, "something useful 3");
combo1.Items.Clear();
combo1.DataSource = dtblDataSource;
combo1.DisplayMember = "DisplayMember";
combo1.ValueMember = "ValueMember";
//Get additional info
foreach (DataRowView drv in combo1.Items)
{
string strAdditionalInfo = drv["AdditionalInfo"].ToString();
}
//Get additional info for selected item
string strAdditionalInfo = (combo1.SelectedItem as DataRowView)["AdditionalInfo"].ToString();
//Get selected value
string strSelectedValue = combo1.SelectedValue.ToString();
// Bind combobox to dictionary
Dictionary<string, string>test = new Dictionary<string, string>();
test.Add("1", "dfdfdf");
test.Add("2", "dfdfdf");
test.Add("3", "dfdfdf");
comboBox1.DataSource = new BindingSource(test, null);
comboBox1.DisplayMember = "Value";
comboBox1.ValueMember = "Key";
// Get combobox selection (in handler)
string value = ((KeyValuePair<string, string>)comboBox1.SelectedItem).Value;
//set
comboBox1.DisplayMember = "Value";
//to add
comboBox1.Items.Add(new KeyValuePair("2", "This text is displayed"));
//to access the ''tag'' property
string tag = ((KeyValuePair< string, string >)comboBox1.SelectedItem).Key;
MessageBox.Show(tag);