デフォルトのコンボボックスを設定する方法

2013年01月30日に質問されました。  ·  閲覧回数 83.7k回  ·  ソース

Roel picture
2013年01月30日

そのため、コンボボックスのデフォルト値を設定することを検討してきました。 私はいくつかのことを見つけましたが、どれもうまくいかないようです。

実際には、単純なコンボボックスを作成してcomboBox1.SelectedIndex = comboBox1.Items.IndexOf("something")を使用すると機能しますが、コンボボックスのコンテンツを動的に生成すると、機能しなくなります。

これは、(クラスのコンストラクターにある)コンボボックスに入力する方法です。

        string command = "SELECT category_id, name FROM CATEGORY ORDER BY name";
        List<string[]> list = database.Select(command, false);

        cbxCategory.Items.Clear();

        foreach (string[] result in list)
        {
            cbxCategory.Items.Add(new ComboBoxItem(result[1], result[0]));
        }

上記のコードの下にcbxCategory.SelectedIndex = cbxCategory.Items.IndexOf("New")を配置すると、機能しないなど、デフォルト値を設定するために機能させることができないようです。

ちなみに、WinForms。

前もって感謝します。

回答

iltzortz picture
2013年01月30日
24

cbxCategory.SelectedIndexは、 0からItems.Count-1ような整数に設定する必要があります。

cbxCategory.SelectedIndex  = 2;

君の

 cbxCategory.SelectedIndex = cbxCategory.Items.IndexOf("New") 

ComboboxItemが文字列をミュートしない限り、-1を返す必要があります( "New");

私はそれがあまり好きではありませんが、別の解決策は

foreach(object obj in cbxCategory.Items){ 
    String[2] objArray = (String[])obj ;
    if(objArray[1] == "New"){
       cbxCategory.SelectedItem = obj;
       break; 
    }
}

おそらくこれには、コードへの次の変換も必要です

    foreach (string[] result in list)
    {
      cbxCategory.Items.Add(result);
    }

コードをテストしておらず、String [2]へのキャストについてはよくわかりませんが、同様の機能が動作するはずです。

RogerN picture
2013年01月30日
1

cbxCategory.Itemsコレクションで文字列を検索しているように見えますが、ComboBoxItemタイプのアイテムが含まれています。 したがって、検索では-1が返されます。

kmatyaszek picture
2013年01月30日
1

LINQを使用できます。

//string command = "SELECT category_id, name FROM CATEGORY ORDER BY name";
//List<string[]> list = database.Select(command, false);
// sample data...
List<string[]> list = new List<string[]> { new string[] { "aaa", "bbb" }, new string[] { "ccc", "ddd" } };

cbxCategory.Items.Clear();

foreach (string[] result in list)
{
    cbxCategory.Items.Add(new ComboBoxItem(result[1], result[0]));
}

ComboBoxItem tmp = cbxCategory.Items.OfType<ComboBoxItem>().Where(x => x.ResultFirst == "bbb").FirstOrDefault();
if (tmp != null)
    cbxCategory.SelectedIndex = cbxCategory.Items.IndexOf(tmp);

ComboBoxItemクラス:

class ComboBoxItem
{
    public string ResultFirst { get; set; }
    public string ResultSecond { get; set; }

    public ComboBoxItem(string first, string second)
    {
        ResultFirst = first;
        ResultSecond = second;
    }
}
spajce picture
2013年01月30日
0

これが私の簡単な解決策です

        var list = comboBox1.Items.Cast<string>().ToList();
        cbxCategory.SelectedIndex = list.FindIndex(c => c.StartsWith("test"));
Nikolay Zhukov picture
2016年09月09日
0

私の解決策:

int? defaultID = null;
foreach (DataRow dr in dataSource.Tables["DataTableName"].Rows)
{
     if ((dr["Name"] != DBNull.Value) && ((string)dr["Name"] == "Default Name"))
     {
          defaultID = (int)dr["ID"];
     }
}
if (defaultID != null) comboBox.SelectedValue = defaultID;