web-dev-qa-db-ja.com

WinFormsおよびC#でドロップダウンメニューを作成する方法

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を試してみましたが、値とラベルを追加することは許可されておらず、ユーザーは必要なものを入力できます。

リストボックスを試しましたが、値とラベルも使用できませんでした。

10
Jaylen

値とキャプション(ラベル)が必要な場合は、適切なクラスを作成します

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;
4
CularBytes

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"));
0
idursun