- PR -

DataGridViewComboBoxColumnにDisplayMemberとValueMemberを設定し、選択たときの挙動をComboBox風にしたい

1
投稿者投稿内容
jiji
会議室デビュー日: 2009/03/10
投稿数: 16
投稿日時: 2009-03-10 19:41
<環境>
Microsoft Visual Studio 2008 Version 9.0.30729.1 SP
Microsoft .NET Framework Version 3.5 SP1
WindowsForm

もし簡単に解決できる方法をご存知でしたら、ご教示お願いします。

DisplayMemberにユニークでない値がある場合、SelectedValueが選択したDisplayMemberに
対応した値になりません。
素のComboBoxだと選択したDisplayMemberに対応したSelectedValueが得られます。


<ミニマムサンプル> 3番めを選択しても"111"と表示されます。
WindowsFormにDataGridViewとTextBoxを一個づつドラッグしただけのフォームです。
コード:
private void Form1_Load(object sender, EventArgs e)
{
    dt = new DataTable("test");
    DataColumn dc = dt.Columns.Add("id", typeof(string));
    dt.Columns.Add("value", typeof(string));
    DataColumn[] dcArr= {dc};
    dt.PrimaryKey = dcArr;
    string[] str1 = { "111", "はは" };
    string[] str2 = { "222", "ハハ" };
    string[] str3 = { "333", "はは" };
    dt.Rows.Add(str1);
    dt.Rows.Add(str2);
    dt.Rows.Add(str3);
    dt.CaseSensitive = true; //trueでDisplayMemberの片仮名と平仮名が区別が出来る
    
    DataGridViewComboBoxColumn dgvc = new DataGridViewComboBoxColumn();
    dgvc.DataSource = dt;
    dgvc.DisplayMember = "value";
    dgvc.ValueMember = "id";
    dataGridView1.Columns.Add(dgvc);
}

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    DataGridView dgv = (DataGridView)sender;
    DataGridViewCell dgvc = dgv[e.ColumnIndex, e.RowIndex];
    textBox1.Text = dgvc.Value.ToString();
}

jiji
会議室デビュー日: 2009/03/10
投稿数: 16
投稿日時: 2009-03-12 16:32
自己レスです。
とりあえずDisplayMemberをユニークにすることで逃げました。

DataGridViewComboBoxEditingControlを拾える範囲では問題ないようなので、
Edit後DataGridViewのCellに反映する時点での問題のような気がします。

DataGridViewComboBoxは今後も良く使いそうなので何とかしたい部分です。
あいにくと根本的に問題を解決するスキルを持ち合わせていない為、次の逃げ道として
ConboBoxのSelectedIndex等をCellに保持できるカスタムDataGridViewを作ろうと
考えております。

もしもっと良い方法をご存知でしたらアドバイスをお願いします。
1

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