Cell中弹出ComboBox
在DataGridView添加CellClick事件。当点击某个Cell时,在Cell上弹出ComboBox。ComboBox选中后在Cell中显示选中值,同时关闭ComboBox。
主要事件
DataGridView_CellClick
private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
int rowNum = e.RowIndex;
int colNum = e.ColumnIndex;
if (rowNum < 0)
{
return; // 点击标题时,row = -1 返回不做处理
}
if (colNum == 0)
{
string value = "";
object cellValue = DataGridView1.Rows[rowNum].Cells[colNum].Value;
if(cellValue != null)
{
value = cellValue.ToString();
}
leftCobmo.SelectedValue = value;
leftCobmo.Name = "DataGridView1_cell_" + rowNum + "_" + colNum;
leftCobmo.SelectedIndexChanged += GridCobmo_SelectedIndexChanged;
Add_Control(DataGridView1, leftCobmo, rowNum, colNum);
}
}
leftCombo配置
public MyForm()
{
InitializeComponent();
this.initConditionList();
this.InitCombo();
}
private void initConditionList()
{
conditionList.Add(new KeyValuePair<string, string>("1", "1"));
conditionList.Add(new KeyValuePair<string, string>("2", "2"));
}
private void InitCombo()
{
leftCobmo.DataSource = conditionList;
leftCobmo.DisplayMember = "value";
leftCobmo.ValueMember = "key";
leftCobmo.DropDownStyle = UIDropDownStyle.DropDownList;
}
在此处leftCombo的DataSource是固定列表。
如果conditionList是动态的,比如从数据库临时查询得到,那么需要在查询后再绑定DataSource。
因为ComboBox一旦设置了DataSource后,DataSource不可改变。
这里的不可改变,指的是,当conditionList发生改变后,leftCombo的选项不变。
如果想要改变leftCombo的数据源,则:
leftCombo.DataSource = null;
leftCombo.Items.Clear();
然后再设置 DataSource。
ComboBox_SelectedIndexChanged
在弹出ComboBox后,为ComboBox绑定SelectedIndexChanged事件。在事件中,把选中值更新到相应的Cell中。
private void GridCobmo_SelectedIndexChanged(object sender, EventArgs e)
{
ComboBox combo = (ComboBox)sender;
string name = combo.Name; // 格式为 gridname_cell_rowIndex_colIndex
string[] arr = name.Split("_");
string gridName = arr[0];
int row = int.Parse(arr[2]);
int col = int.Parse(arr[3]);
Control[] grids = this.Controls.Find(gridName, true); // 查找到 DataGridView
if (grids != null && grids.Length > 0)
{
DataGridView grid = (DataGridView)grids[0];
string value = combo.SelectedValue.ToString(); // 获取combobox选中值
grid.EndEdit(); // 在编辑状态下,无法对cell进行赋值。先结束编辑状态再赋值。
grid.Rows[row].Cells[col].Value = combo.SelectedValue;
grid.Controls.Remove(combo); // 从DataGridView中删除ComboBox
}
combo.SelectedIndexChanged -= GridCobmo_SelectedIndexChanged; // 去除SelectedIndexChanged事件
}
Add_Control方法
把弹出的ComboBox显示在DataGridView的相应位置上。
public void Add_Control(DataGridView grid, Control ctrl, int row_index, int col_index)
{
grid.Controls.Add(ctrl);
ReLocation(grid, ctrl, row_index, col_index);
Rectangle rectangle = grid.GetCellDisplayRectangle(col_index, row_index, true);
ctrl.Size = new Size(rectangle.Width, rectangle.Height - 2);
ctrl.Location = new Point(rectangle.Left, rectangle.Top);
}
以上,即全部主要代码。