いくつかのDataGridViewComboBoxColumnsを持つDataGridViewがあります。コンボボックスのシングルクリックドロップダウンを目的として、DataGridViewにCellEnterイベントハンドラーがあります。
列はKeyValuePairsのリストにバインドされ、ValueMemberは「Key」、DisplayMemberは「Value」です。
コンボボックスの列をクリックすると、正常に機能します。ただし、セルが「ドロップダウン」状態にあり、別のコンボボックス(同じ列、別の行)をクリックすると、古いセルの選択が適切に解除され、新しいセルが選択されてドロップダウンされますが、上部の選択された値はに変わります。正しいセルに戻す前に、古いセルから一瞬の値。
たとえば、リストがA、B、Cであるとします。行1でAが選択され、行2でBが選択されます。行1のセルをクリックすると、すべてが正常になります。次に、このセルをドロップダウンしながら、row2のセルをクリックします。正しくドロップダウンしますが、一番上で選択した値がAになり、すぐにB(正しい値)に戻ります。
2番目のコンボボックスセルをクリックする前に他の列のセルをクリックしても、これは発生しません。
これを防ぐ方法はありますか?
問題を再現するためのサンプルコード(イベントハンドラーは明らかなイベントに接続されています):
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace PDGV
{
public partial class Form1 : Form
{
List<KeyValuePair<string, string>> bindingList = new List<KeyValuePair<string, string>>();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.Rows.Add(10);
bindingList.Add(new KeyValuePair<string,string>("aaa", "111"));
bindingList.Add(new KeyValuePair<string,string>("bbb", "222"));
bindingList.Add(new KeyValuePair<string,string>("ccc", "333"));
bindingList.Add(new KeyValuePair<string,string>("ddd", "444"));
bindingList.Add(new KeyValuePair<string,string>("eee", "555"));
BindComboList(2, bindingList);
}
private void BindComboList(int columnIndex, object list)
{
var column = dataGridView1.Columns[columnIndex] as DataGridViewComboBoxColumn;
if (column != null)
{
column.DataSource = new BindingSource(list, null);
column.DisplayMember = "Value";
column.ValueMember = "Key";
}
}
private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex == -1)
return;
dataGridView1.BeginEdit(true);
var control = dataGridView1.EditingControl as DataGridViewComboBoxEditingControl;
if (control != null)
control.DroppedDown = true;
}
}
}