- PR -

DataSourceを設定したコンボボックスに空行を追加

1
投稿者投稿内容
Shane
大ベテラン
会議室デビュー日: 2003/06/06
投稿数: 132
お住まい・勤務地: Vancouver, BC
投稿日時: 2008-10-17 02:48
Linq to SQL で取得したデータソースを以下のようにコンボボックスに設定しています。

categoryComboBox.DataSource = categories.ToArray();
categoryComboBox.ValueMember = "ID";
categoryComboBox.DisplayMember = "Name";
categoryComboBox.DataBindings.Add(new Binding("SelectedValue", entity, "CategoryID", true, DataSourceUpdateMode.OnPropertyChanged));

テーブル側の CategoryID は NULL を許容するので、ユーザにはブランクを選択させることができなくてはなりません。

しかし、コンボボックスに DataSource を設定していると combo.Items.Insert(0, "") ができません。また、カテゴリテーブルにブランク用のレコードを追加すると言う選択肢は許されない状況です。

combo.SelectedIndex = -1 とすることで初期状態は未選択とすることができますが、一度選択し保存してしまった場合、ユーザはそれをブランクに設定することができません。

何かいい解決策はありますでしょうか?
Shane
大ベテラン
会議室デビュー日: 2003/06/06
投稿数: 132
お住まい・勤務地: Vancouver, BC
投稿日時: 2008-10-18 03:24
とりあえず解決しました。

以下のように、Linq to SQL で取得したものを ToList() し、そこの先頭にブランクレコードを挿入、

コード:
            var categories = (
                from n in dc.categories
                select new ListItem(n.CategoryID, n.CategoryName)
                ).ToList();
            categories.Insert(0, new ListItem(null, ""));



それを ToArray() してコンボボックスのデータソースに設定、

コード:
            categoryComboBox.DataSource = categories.ToArray();
            categoryComboBox.ValueMember = "ID";
            categoryComboBox.DisplayMember = "Name";
            categoryComboBox.DataBindings.Add(new Binding("SelectedValue", entity, "CategoryID", true, DataSourceUpdateMode.OnPropertyChanged));



これで対応できました。

匿名クラスでは ID に null を設定できないので、便宜上以下のクラスを定義して使ってます。匿名クラスで ID = 0 として、Entity の PropertyChanged イベントで null にしてやってもいいかもしれません。

コード:
    public class ListItem
    {
        public int? ID { get; set; }
        public string Name { get; set; }

        public ListItem(int? id, string name)
        {
            ID = id;
            Name = name;
        }
    }

1

スキルアップ/キャリアアップ(JOB@IT)