回答:
独自のクラス型を作成し、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());
}
// 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;
次のような匿名クラスを使用できます。
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;
List<Object> items = new List<Object>();
を使用してitems.Add( new { Text = "report A", Value = "reportA" } );
、ループ内でメソッドを使用することができました。
comboBox.SelectedItem.GetType().GetProperty("Value").GetValue(comboBox.SelectedItem, null)
DataSource
使用できるように設定する2番目のソリューションを使用するSelectedValue
場合SelectedText
、特別なキャストを行う必要はありません。
dynamic
実行時にコンボボックス項目を解決するには、オブジェクトを使用する必要があります。
comboBox.DisplayMember = "Text";
comboBox.ValueMember = "Value";
comboBox.Items.Add(new { Text = "Text", Value = "Value" });
(comboBox.SelectedItem as dynamic).Value
にDictionary
テキストと値を追加するカスタムクラスを作成する代わりに、Object を使用できますCombobox
。
Dictionary
オブジェクトにキーと値を追加します。
Dictionary<string, string> comboSource = new Dictionary<string, string>();
comboSource.Add("1", "Sunday");
comboSource.Add("2", "Monday");
ソースディクショナリオブジェクトをにバインドします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;
完全なソース:コンボボックスのテキストと値
これは、思いついた方法の1つです。
combo1.Items.Add(new ListItem("Text", "Value"))
そして、アイテムのテキストまたは値を変更するには、次のようにします。
combo1.Items[0].Text = 'new Text';
combo1.Items[0].Value = 'new Value';
WindowsフォームにはListItemというクラスはありません。これはASP.NETにのみ存在するため、使用する前に独自のクラスを作成する必要があります。@ Adam Markowitzが彼の回答で行ったのと同じです。
これらのページもチェックしてください。
これが元の投稿で与えられた状況でうまくいくかどうかはわかりません(これが2年後であることを気にしないでください)。この例は私にとってはうまくいきます:
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);
まだこれに興味がある場合は、テキストと任意のタイプの値を持つコンボボックス項目のシンプルで柔軟なクラスを次に示します(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;
}
}
を使用すること<T>
は、をvalue
として宣言するよりも優れobject
ています。object
あなたは、あなたがそれぞれのアイテムに使用されるタイプのトラックを保持する必要があるだろう、とすると、それを正しく使用するようにコードでそれをキャスト。
私はかなり長い間、私のプロジェクトでそれを使用しています。本当に重宝しています。
私はfabの答えが好きでしたが、私の状況では辞書を使いたくなかったので、タプルのリストを置き換えました。
// 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;
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();
このコードを使用して、テキストと値を含むいくつかの項目をコンボボックスに挿入できます。
C#
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");
}
XAML
<ComboBox x:Name="combox" SelectionChanged="ComboBox_SelectionChanged_1"/>
Adam Markowitzの回答に加えてItemSource
、コンボボックスの値を(比較的)単純に設定しenums
、 '説明'属性をユーザーに表示する一般的な方法を次に示します。(誰もが.NETの 1つのライナーになるようにこれを実行したいと思うでしょうが、そうではありません。これは私が見つけた最もエレガントな方法です)。
最初に、任意の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
。
一般的なタイプを使用できます:
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);
}
私は同じ問題を抱えていましたがComboBox
、最初のインデックスと同じインデックスの値だけで新しいものを追加し、次に2番目のインデックスのプリンシパルコンボを変更すると、同時に値が変更されました。 2番目のコンボの使用します。
これはコードです:
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;
}
クラス作成:
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);
}
}
}
これは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
通話まだ仕事。
これは他のいくつかの回答と似ていますが、コンパクトであり、リストが既にある場合は辞書への変換を回避できます。
ComboBox
Windowsフォーム上の「コンボボックス」とtypeプロパティを持つクラスSomeClass
を考えると、string
Name
List<SomeClass> list = new List<SomeClass>();
combobox.DisplayMember = "Name";
combobox.DataSource = list;
つまり、SelectedItemはのSomeClass
オブジェクトlist
であり、の各アイテムはcombobox
その名前を使用して表示されます。
DisplayMember
以前に使用したことがあります...それが存在することをいつも忘れます。このプロパティに注意を払う前に見つけた解決策に慣れましたが、常に役立つとは限りません。すべてのクラスにName
or Tag
プロパティがあるわけではありません。また、表示テキストとして任意に使用できる文字列プロパティがあるわけでもありません。
base.Method();
で多数のメソッドを作成します)。また、派生クラスを作成する必要があります。コンボボックスまたはリストボックスに追加するタイプごとに。私が作ったクラスは柔軟性があり、どんなタイプでも余計な手間をかけずに使うことができます。以下の私の答えを見て、あなたの考えを教えてください:)
これは、(文字列)としての最終的な値がすべて必要な場合の、Windowsフォームの非常に単純なソリューションです。アイテムの名前がコンボボックスに表示され、選択した値を簡単に比較できます。
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();
ここでより良いソリューション;
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";
データを取得する
MessageBox.Show(cmbUser.SelectedValue.ToString());