ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-11-01 14:01:41  阅读:359  来源: 互联网

标签:case 控件 Task 自定义 comboBox 单元格 break rect ViewEdit


场景

鼠标点击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;
            }
        }

 

标签:case,控件,Task,自定义,comboBox,单元格,break,rect,ViewEdit
来源: https://www.cnblogs.com/badaoliumangqizhi/p/11776580.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有