DataGridView中实现点击单元格Cell动态添加自定义控件

mac2025-06-09  52

场景

鼠标点击DataGridView的某个单元格时,此单元格添加一个自定义的控件,这里以

添加下拉框为例

效果

 

注:

博客主页:https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书、教程推送与免费下载。

实现

在设计器页面,找到DataGridView的单元格点击事件CellClick,然后双击进入其点击事件中

 

private void dataGridView_Task_ViewEdit_CellClick(object sender, DataGridViewCellEventArgs e)         {             //获取当前点击的列的index             int currentColumnindex = dataGridView_Task_ViewEdit.CurrentCell.ColumnIndex;             //获取当前行的index             int currentRowindex = dataGridView_Task_ViewEdit.CurrentCell.RowIndex;             switch (currentColumnindex)             {                 case 2:                     //第三列-控制模式                     Cell2Click(currentColumnindex,currentRowindex);                     break;                 case 3:                     //第四列-跳转条件                     break;                 case 4:                     //第五列-记录条件                     break;                 case 5:                     //第六列-电流量程                     break;                 default:                     break;             }         }

然后在通过当前列的Index判断是那一列,再执行具体的操作,添加不同的控件。

这里操作第三列,然后执行方法Cell2Click,并将当前行与列的index传递。

private void Cell2Click(int currentColumnindex, int currentRowindex)         {             //下拉框控件             DevExpress.XtraEditors.ComboBoxEdit comboBox = new DevExpress.XtraEditors.ComboBoxEdit();  //添加ComboBox             comboBox.Name = "ControlModel_ComBox";             ComboBoxItemCollection coll = comboBox.Properties.Items;             //添加             this.dataGridView_Task_ViewEdit.Controls.Add(comboBox);             //获取当前单元格的内容             string currentCellValue = this.dataGridView_Task_ViewEdit.Rows[currentRowindex].Cells[currentColumnindex].Value.ToString();             //清空单元格内容             this.dataGridView_Task_ViewEdit.Rows[currentRowindex].Cells[currentColumnindex].Value = String.Empty;             //获取大小             Rectangle rect = dataGridView_Task_ViewEdit.GetCellDisplayRectangle(currentColumnindex, currentRowindex, true);             //大小设置             comboBox.Size = new Size((rect.Width / 3), rect.Height);             //位置设置             comboBox.Location = new Point(rect.Left, rect.Top);                         //根据配置文件获取下拉框items选项             int i=0;             List<ControlModelItem> controlModelItems = TaskViewEditHelper.GetComboBoxItems(System.IO.Path.Combine(Global.AppConfig.SysConfigPath, Global.CONTROL_MODEL_ITEMS_FILE_PATH));             foreach(ControlModelItem controlModelItem in controlModelItems)             {                 coll.Add(controlModelItem);                 if (controlModelItem.Value == currentCellValue)                     comboBox.SelectedIndex = i;                 i++;             }             //通过下面可以获取选中项的内容             if (comboBox.SelectedItem != null)             {                 string key = (comboBox.SelectedItem as ControlModelItem).Key;                 string value = (comboBox.SelectedItem as ControlModelItem).Value;             }                         //绑定事件--控制模式下拉框选项改变             comboBox.SelectedValueChanged += comboBox_SelectedValueChanged;         }

这里是添加了一个DevExpress的下拉框控件ComboBoxEdit控件,并添加下拉框选项,然后绑定下拉框内容改变的事件comboBox_SelectedValueChanged。

同理在改变下拉框选项的事件中在分别实现添加控件

private void comboBox_SelectedValueChanged(object sender, EventArgs e)         {             int controlCount = this.dataGridView_Task_ViewEdit.Controls.Count;             //初始化会有三个控件             if (controlCount>3)             {                 for (int i = 3; i < controlCount; i++)                 {                     //删除第三个之后的控件,删除后索引减1 所以循环删除第四个控件                     this.dataGridView_Task_ViewEdit.Controls.RemoveAt(3);                 }             }             DevExpress.XtraEditors.ComboBoxEdit comboBox = sender as ComboBoxEdit;             ControlModelItem controlModelItem = comboBox.SelectedItem as ControlModelItem;             string controlModelItemkey = controlModelItem.Key;             switch (controlModelItemkey)             {                 //恒压                 case "ConstantVoltage":                     int currentColumnindex = dataGridView_Task_ViewEdit.CurrentCell.ColumnIndex;                     int currentRowindex = dataGridView_Task_ViewEdit.CurrentCell.RowIndex;                     TextEdit textEdit = new TextEdit();                     textEdit.Name = "ControlMode_ConstantVoltage_textEdit";                     this.dataGridView_Task_ViewEdit.Controls.Add(textEdit);                                         //获取大小                     Rectangle rect = dataGridView_Task_ViewEdit.GetCellDisplayRectangle(currentColumnindex, currentRowindex, true);                     //大小设置                     textEdit.Size = new Size((rect.Width / 6) + Global.CONTROL_DISTANCE, rect.Height);                     //位置设置                     textEdit.Location = new Point(rect.Left + (rect.Width / 3), rect.Top);                     LabelControl label = new LabelControl();                     label.Name = "ControlMode_ConstantVoltage_label";                     this.dataGridView_Task_ViewEdit.Controls.Add(label);                     label.Text = "V";                     //位置设置                     label.Location = new Point(rect.Left + (rect.Width / 3) + (rect.Width / 6) + Global.CONTROL_DISTANCE * 2, rect.Top + Global.LABEL_FROM_TOP_DISTANCE);                     break;                 case "Shelve":                     break;                 case "ConstantCurrent":                     break;                 case "ConstantPower":                     break;                 case "ConstantLoad":                     break;                 case "Cycle":                     break;                 case "CurrentSlope":                     break;                 case "CurrentLadder":                     break;                 case "ConstantVoltageLimitCurrent":                     break;                 case "CurrentPulse":                     break;                 case "WorkingConditionSimulation":                     break;                 case "PowerRamp":                     break;                 case "PowerLadder":                     break;                 default:                     break;             }         }

 

最新回复(0)