ComboBox: добавление текста и значения в элемент (без источника привязки)
В С# WinApp, как я могу добавить текст и значение в элементы моего ComboBox?
Я сделал поиск, и обычно ответы используют "привязку к источнику".. но в моем случае у меня нет источника привязки, готового в моей программе...
Как я могу сделать что-то вроде этого:
combo1.Item[1] = "DisplayText";
combo1.Item[1].Value = "useful Value"
Ответы
Ответ 1
Вы должны создать свой собственный тип класса и переопределить метод ToString(), чтобы вернуть нужный текст. Вот простой пример класса, который вы можете использовать:
public class ComboboxItem
{
public string Text { get; set; }
public object Value { get; set; }
public override string ToString()
{
return Text;
}
}
Ниже приведен простой пример его использования:
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());
}
Ответ 2
// 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;
Ответ 3
Вы можете использовать анонимный класс следующим образом:
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" });
ОБНОВЛЕНИЕ: Несмотря на то, что выше код будет правильно отображаться в поле со списком, вы не сможете использовать SelectedValue
или SelectedText
свойства ComboBox
. Чтобы иметь возможность использовать их, соедините поле со списком следующим образом:
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;
Ответ 4
Это один из способов, который только пришел на ум:
combo1.Items.Add(new ListItem("Text", "Value"))
И чтобы изменить текст или значение элемента, вы можете сделать это следующим образом:
combo1.Items[0].Text = 'new Text';
combo1.Items[0].Value = 'new Value';
В классе Windows Forms. Он существует только в ASP.NET, поэтому вам нужно будет написать свой собственный класс перед его использованием, так же, как @Adam Markowitz сделал в его ответ.
Также проверьте эти страницы, они могут помочь:
Ответ 5
Не знаю, будет ли это работать для ситуации, указанной в исходном посте (неважно, что это происходит через два года), но этот пример работает для меня:
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";
Чтобы прочитать ваше значение обратно, вам нужно передать свойство SelectedItem объекту DictionaryEntry, а затем вы можете оценить его свойства Key и Value. Например:
DictionaryEntry deImgType = (DictionaryEntry)cmbImageType.SelectedItem;
MessageBox.Show(deImgType.Key + ": " + deImgType.Value);
Ответ 6
Вы должны использовать объект dynamic
для разрешения элемента combobox во время выполнения.
comboBox.DisplayMember = "Text";
comboBox.ValueMember = "Value";
comboBox.Items.Add(new { Text = "Text", Value = "Value" });
(comboBox.SelectedItem as dynamic).Value
Ответ 7
//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);
Ответ 8
Вы можете использовать Dictionary
Object вместо создания пользовательского класса для добавления текста и значения в Combobox
.
Добавить ключи и значения в Dictionary
Объект:
Dictionary<string, string> comboSource = new Dictionary<string, string>();
comboSource.Add("1", "Sunday");
comboSource.Add("2", "Monday");
Привяжите исходный объект Dictionary к Combobox
:
comboBox1.DataSource = new BindingSource(comboSource, null);
comboBox1.DisplayMember = "Value";
comboBox1.ValueMember = "Key";
Получить ключ и значение:
string key = ((KeyValuePair<string,string>)comboBox1.SelectedItem).Key;
string value = ((KeyValuePair<string,string>)comboBox1.SelectedItem).Value;
Полный исходный код: Комбинированное текстовое значение
Ответ 9
Пример использования 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();
Ответ 10
Мне понравился потрясающий ответ, но я не хотел использовать словарь для своей ситуации, поэтому я заменил список кортежей.
// 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;
Ответ 11
Вы можете использовать этот код combox добавить элемент с текстом и его значением
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");
}
Ответ 12
В ответ на ответ Адама Марковица, здесь приведен общий способ (относительно), просто устанавливающий значения ItemSource
в поле со списком enums
, показывая пользователю атрибут "Описание". (Вы думаете, что каждый захочет сделать это так, что это будет .NET один лайнер, но это просто не так, и это самый элегантный способ, который я нашел).
Сначала создайте этот простой класс для преобразования любого значения Enum в элемент 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;
}
}
Во-вторых, в вашем обработчике событий OnLoad
вам нужно установить источник вашего списка со списком ComboEnumItems
на основе каждого Enum
в вашем типе Enum
. Это может быть достигнуто с помощью Linq. Затем просто установите 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";
}
Теперь пользователь будет выбирать из списка вашего дружественного пользователя Descriptions
, но то, что они выбрали, будет значением Enum
, которое вы можете использовать в коде.
Чтобы получить доступ к выбору пользователя в коде, comboBoxUserReadable.SelectedItem
будет ComboEnumItem
и comboBoxUserReadable.SelectedValue
будет EMyEnum
.
Ответ 13
Вы можете использовать общий тип:
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;
}
}
Пример использования простого 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);
}
Ответ 14
Если кому-то все еще интересно, вот простой и гибкий класс для элемента combobox с текстом и значением любого типа (очень похоже на пример Адама Марковица):
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;
}
}
Использование <T>
лучше, чем объявление value
как object
, потому что при object
вам нужно будет отслеживать тип, который вы использовали для каждого элемента, и отбрасывать его в свой код для правильного использования.
Я уже давно использую его в своих проектах. Это действительно удобно.
Ответ 15
У меня была та же проблема, что я и делал, добавляя новый ComboBox
с только значением в том же индексе, а затем первым, а затем, когда я меняю основной комбо, индекс во втором изменяется в одно и то же время, тогда я беру значение второго комбо и использую его.
Это код:
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;
}
Ответ 16
Тип класса:
namespace WindowsFormsApplication1
{
class select
{
public string Text { get; set; }
public string Value { get; set; }
}
}
Коды 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);
}
}
}
Ответ 17
Вот как это делает Visual Studio 2013:
Отдельный элемент:
comboBox1->Items->AddRange(gcnew cli::array< System::Object^ >(1) { L"Combo Item 1" });
Несколько элементов:
comboBox1->Items->AddRange(gcnew cli::array< System::Object^ >(3)
{
L"Combo Item 1",
L"Combo Item 2",
L"Combo Item 3"
});
Не нужно делать переопределения класса или включать что-либо еще. И да, все еще работают вызовы comboBox1->SelectedItem
и comboBox1->SelectedIndex
.
Ответ 18
Это похоже на некоторые другие ответы, но является компактным и позволяет избежать преобразования в словарь, если у вас уже есть список.
С учетом ComboBox
"combobox" в форме окна и класса SomeClass
с свойством типа string
Name
,
List<SomeClass> list = new List<SomeClass>();
combobox.DisplayMember = "Name";
combobox.DataSource = list;
Это означает, что SelectedItem является объектом SomeClass
из list
, и каждый элемент в ComboBox
будет отображаться с использованием его имени.
Ответ 19
Это очень простое решение для форм Windows, если все это необходимо, это окончательное значение как (строка). Имена элементов будут отображаться в Combo Box, и выбранное значение можно легко сравнить.
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;
а на обработчике события получить значение (строку) выбранного значения
string test = testComboBox.SelectedValue.ToString();