DataGridView 内含 ComboBox的用法(赋值,两个下拉框联动,得到下拉框所取值)

本文详细介绍了使用C#实现DataGridView的高级功能,包括初始化设置、Checkbox联动、下拉框交互等,展示了如何通过代码实现复杂的数据表格操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 创建一个窗口

右边的部分即为一个datagridview表,表名为OrganNameChange(后续代码会用到);

表包含四列:“Organ Names” 为文本框,“Check”为勾选框,“Type”和“Rename”均为下拉框。

1.1  datagridview的基本设置

这里的datagridview的基本设置有:

表的前一列不显示(c#默认显示):RowHeadersVisible 设为true;

表的最后一行不显示:AllowUserToAddRows 设为 false;

整个表的颜色想要交替出现:AlternatingRowsDefaultCellStyle中的背景色设置;

表的只读属性:设置ReadOnly

1.2 表格的功能介绍

表格第一列:“Organ Names”需要从外部读入数据;

表格第二列:在“All”勾选后,所有第二列全部被勾选,同时下拉框清空;一旦第二列中的一个被取消勾选,“All”也取消勾选,同时这一个单元格所在的行“Type”被初始化,可以进行下拉操作;

表格第三列:“Type”被选择后,“Rename”根据“Type”中所选的内容进行初始化,同时可以进行下拉操作;

表格第四列:“Rename”被选择后,得到下拉框所选的内容,将该列的值存储。

2. 功能实现

2.1 界面初始化

界面在打开时,可对整个界面进行初始化,并注册事件,代码如下(datagridview名为OrganNameChange)

private void InitializeView()  
{  
    All_check.Checked = true;  
    All_check_CheckedChanged(null, null);  
    this.OrganNameChange.EditingControlShowing -= new DataGridViewEditingControlShowingEventHandler(OrganNameChange_EditingControlShowing);  
    this.OrganNameChange.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(OrganNameChange_EditingControlShowing);  
    this.OrganNameChange.CellClick -= new DataGridViewCellEventHandler(OrganNameChange_CellClick);  
    this.OrganNameChange.CellClick += new DataGridViewCellEventHandler(OrganNameChange_CellClick);  
    this.OrganNameChange.DataError += delegate(object sender, DataGridViewDataErrorEventArgs e){ };  
}

其中加载了“All”的初始状态和“All”被勾选后的其他联动;剩余几个就是下拉框的一些事件了。

2.2  “All” checkbox的勾选事件

所有第二列全部被勾选,同时下拉框清空

        private void All_check_CheckedChanged(object sender, EventArgs e)
        {
            if(All_check.Checked)
            {
                for(int k = 0; k < OrganNameChange.RowCount; k++)
                {
                    OrganNameChange.Rows[k].Cells["Check"].Value = true;
                    DataGridViewComboBoxCell groupNames = (DataGridViewComboBoxCell)OrganNameChange.Rows[k].Cells["Type"];
                    DataGridViewComboBoxCell organNames = (DataGridViewComboBoxCell)OrganNameChange.Rows[k].Cells["Rename"];
                    groupNames.Items.Clear();
                    organNames.Items.Clear();
                    groupNames.ReadOnly = true;
                    organNames.ReadOnly = true;
                }
            }
        }

2.3 每列CheckBox 的勾选状态事件

一旦第二列中的一个被取消勾选,“All”也取消勾选,同时这一个单元格所在的行“Type”被初始化,可以进行下拉操作

        private void OrganNameChange_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            int k = e.RowIndex;
            DataGridViewCheckBoxCell check_cur = (DataGridViewCheckBoxCell)OrganNameChange.Rows[k].Cells["Check"];
            DataGridViewComboBoxCell groupNames = (DataGridViewComboBoxCell)OrganNameChange.Rows[k].Cells["Type"];
            DataGridViewComboBoxCell organNames = (DataGridViewComboBoxCell)OrganNameChange.Rows[k].Cells["Rename"];
            if(e.ColumnIndex == 1) //checkBox改动
            {
                bool flag = Convert.ToBoolean(check_cur.EditedFormattedValue);
                if(!flag)
                {
                    All_check.Checked = false;
                    groupNames.ReadOnly = false;
                    organNames.ReadOnly = false;
                    foreach (TreeSave<OrganInfoModel> groupInfo in allOrganInfo.Nodes)
                    {
                        //从外部传入数据,改变下拉框的items
                        groupNames.Items.Add(groupInfo.Data.ItemName);
                    }                    
                }
                else
                {
                    groupNames.Items.Clear();
                    organNames.Items.Clear();
                    groupNames.ReadOnly = true;
                    organNames.ReadOnly = true;
                }
            }
        }

2.4 下拉框的选择和初始化

        private void OrganNameChange_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            if(OrganNameChange.CurrentCell != null && e.Control.GetType() == typeof(DataGridViewComboBoxEditingControl))
            {
                //向用户显示用于编辑选定单元格的值中的控件
                tempGroupName = e.Control as ComboBox;
                //创建下拉框改变事件
                (tempGroupName).SelectedIndexChanged -= new EventHandler(ComboBox_SelectedIndexChanged);
                (tempGroupName).SelectedIndexChanged += new EventHandler(ComboBox_SelectedIndexChanged);
            }
        }
        /// <summary>
        /// 这里可以开始写下拉框具体要做什么
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ComboBox_SelectedIndexChanged(object sender,EventArgs e)
        {
            int k = OrganNameChange.CurrentCell.RowIndex;
            DataGridViewComboBoxCell ReOrganNames = (DataGridViewComboBoxCell)OrganNameChange.Rows[k].Cells["Rename"];
            if(OrganNameChange.CurrentCell.ColumnIndex == 2) //在Type栏选择后,对Rename栏初始化
            {
                ReOrganNames.Items.Clear();
                foreach (TreeSave<OrganInfoModel> organInfo in allOrganInfo.Nodes[0].Nodes)
                {
                    ReOrganNames.Items.Add(organInfo.Data.ItemName);
                }
            }
            if(OrganNameChange.CurrentCell.ColumnIndex == 3) //在Rename栏中选中organname后
            {
                string curName = tempGroupName.Text.ToString();
                OrganNameChange.CurrentCell.Value = curName;
                standOrganNames[k] = curName; //把下拉框选中的值传至standOrganNames储存起来
            }
        }
        /// <summary>
        /// datagridview中单元格被点击后的事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OrganNameChange_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            DataGridView tempDataGridView = sender as DataGridView;
            DataGridViewComboBoxEditingControl ec = tempDataGridView.EditingControl as DataGridViewComboBoxEditingControl;
            if(ec == null) //当前ComboBox不在编辑状态
            {
                SendKeys.Send("{F4}"); //展开当前ComboBoxCell
            }
        }

所有功能实现就到此结束了。

3. 实际效果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值