VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > c#教程 >
  • C#教程之DataGridView中实现点击单元格Cell动态添加自定义控件

本站最新发布   C#从入门到精通
试听地址  
https://www.xin3721.com/eschool/CSharpxin3721/

场景

鼠标点击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;
            }
        }
复制代码

 

博客园: https://www.cnblogs.com/badaoliumangqizhi/ 关注公众号 霸道的程序猿 获取编程相关电子书、教程推送与免费下载。
相关教程