Visual Studio/WinForms/C#を初めて使用する
各値に値とラベルを設定できるシンプルなドロップダウンメニューを作成しようとしています。
これは、Webアプリを作成する場合にHTMLで行うことです。しかし、C#とWinFormsでこれを行うにはどうすればよいですか?
<select>
<option value="0">Please select One</option>
<option value="1">The first Options</option>
<option value="2">The Second Options</option>
<option value="3">The Third Options</option>
</select>
ComboBoxを試してみましたが、値とラベルを追加することは許可されておらず、ユーザーは必要なものを入力できます。
リストボックスを試しましたが、値とラベルも使用できませんでした。
値とキャプション(ラベル)が必要な場合は、適切なクラスを作成します
class ComboItem
{
public int ID { get; set; }
public string Text { get; set; }
}
ComboBoxで、DisplayMember
プロパティをText
に設定し、ValueMember
プロパティをID
に設定します。
ComboBoxのDropDownStyle
がその動作を決定します。 DropDownStyle.DropDown
は、ユーザーがテキストを入力できるようにします。 DropDownStyle.DropDownList
ユーザーはリストから項目のみを選択できます。
次のようにComboBox
に入力できます:
myCombo.DataSource = new ComboItem[] {
new ComboItem{ ID = 1, Text = "One" },
new ComboItem{ ID = 2, Text = "Two" },
new ComboItem{ ID = 3, Text = "Three" }
};
DataSource
には、列挙可能な任意の種類を指定できます。
このように選択したIDを取得できます
int id = (int)myComboBox.SelectedValue;
任意のタイプのアイテムをComboBoxに追加できることに注意してください。 DisplayMember
プロパティとValueMember
プロパティを指定しない場合、ComboBoxはオブジェクトのToString
メソッドを使用して表示されるテキストを決定し、選択したアイテムを取得できます(選択した値)SelectedItem
プロパティを介して。
このタイプのオブジェクトを追加すると...
class Person
{
public int PersonID { get; set }
public string FirstName { get; set; }
public string LastName { get; set; }
public override string ToString()
{
return FirstName + " " + LastName;
}
}
... ComboBoxに、このように選択したアイテムを取得できます
Person selectedPerson = (Person)myComboBox.SelectedItem;
int personID = selectedPerson.PersonID;
ComboBoxには、個人の姓と名が表示されます。
Comboboxのデータソースを設定する必要があります。たとえば、クラスを作成してオブジェクトのリストを渡すとよいでしょう:
_private void Init()
{
List<Item> items = new List<Item>();
items.Add(new Item() { Text = "displayText1", Value = "ValueText1" });
items.Add(new Item() { Text = "displayText2", Value = "ValueText2" });
items.Add(new Item() { Text = "displayText3", Value = "ValueText3" });
comboBox1.DataSource = items;
comboBox1.DisplayMember = "Text";
comboBox1.ValueMember = "Value";
}
public class Item
{
public Item() { }
public string Value { set; get; }
public string Text { set; get; }
}
_
Init()
メソッドをFormName_Load(object sender, EventArgs e){}
に入れます。
値は、選択されたアイテムへの単なる参照のようです、正しいですか?その後、コンボボックスのインデックスを使用して、それをはるかに簡単にすることができます。
ビルド前にアイテムがわかっているかどうかわからない場合は、コンボボックスのデザイナーのプロパティに追加します。そうでない場合は、以下を実行するだけで動的に追加できます。
List<string> items = new List<string>() { "item1", "item2" };
comboBox1.DataSource = items;
そして、どのアイテムが選択されているかを知るには:
int index = comboBox1.SelectedIndex;
ComboBoxはToString
呼び出しから返された結果を表示するため、値をラップしてテキストを表示するDisplayクラスを定義し、それらをコンボボックスに追加できます。
あれは:
public class ItemDisplay<TValue>
{
private readonly string m_displayText;
public ItemDisplay(TValue value, String displayText)
{
this.Value = value;
m_displayText = displayText;
}
public TValue Value { get; set; }
public override string ToString()
{
return m_displayText;
}
}
次のようにコンボボックスにアイテムを追加します。
comboBox1.Items.Add(new ItemDisplay<int>(1, "FirstValue"));
comboBox1.Items.Add(new ItemDisplay<int>(2, "Second"));
comboBox1.Items.Add(new ItemDisplay<int>(3, "Third"));