博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于DataGridViewComboBoxCell修改后提交数据源
阅读量:5742 次
发布时间:2019-06-18

本文共 3395 字,大约阅读时间需要 11 分钟。

最近在项目遇到一个功能实现。是在DataGridView中DataGridViewComboboxColumn列绑定数据源,

DisplayMember为数据表的Name列,ValueMember是数据表的ID列。

需求是希望对DataGridView的ComboBoxCell进行编辑,添加新的选项并更新数据源及数据绑定。

1.使DataGridViewComboBoxCell进入编辑状态,这个很简单。做法如下:

注册DataGridView的EditingControlShowing事件,代码如下:

 

private void dgv_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)        {            DataGridView dgv = sender as DataGridView;            bool isRight =                 dgv.CurrentCellAddress.X == ColJCFF.DisplayIndex;            if (isRight)            {                ComboBox cb = e.Control as ComboBox;                if (cb != null)                {                    cb.DropDownStyle = ComboBoxStyle.DropDown;                 }            }        }

2.获取输入数据,检查并实现更新数据源

注册DataGridView的CellValidating事件,判断输入的数据是否在数据源中,

如果不在那么提交更改,重新绑定DataGridViewComboboxColumn数据。代码如下:

 

private void dgvMode_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)        {            DataGridView dgv = sender as DataGridView;            bool isempty = string.IsNullOrEmpty(e.FormattedValue.ToString());            DataGridViewComboBoxColumn cmbCol = dgv.Columns[e.ColumnIndex] as DataGridViewComboBoxColumn;            if (cmbCol == null)                return;            if (!isempty)            {                bool isCol = dgv.Columns[e.ColumnIndex].Name == cmbCol.Name;                if (isCol)                {                    //现有选项中不包含输入数据                    if (!cmbCol.Items.Contains(e.FormattedValue))                    {                        //获取数据源                        DataTable dt = cmbCol.DataSource as DataTable;                        if (dt == null)                            return;                        string valueStr = "";//新添加的ID                        //判读数据源中是否包含输入数据                        DataRow[] rows = dt.Select(cmbCol.DisplayMember + " = '" + e.FormattedValue + "'");                        if (rows.Length == 0)//没有包含                        {                            string guid = GetNewID();//获取新的ID                            dt.Rows.Add();                            dt.Rows[dt.Rows.Count - 1][1] = e.FormattedValue.ToString();                            dt.Rows[dt.Rows.Count - 1][0] = guid;                             valueStr = guid;                                UpDataMethod(dt);//更新数据                            //重新绑定列数据源                            BindColumn();                        }                        else//如果集合内包含此数据                            valueStr = rows[0][0].ToString();                        //更新DataGridView数据                        ComboBox cmb = dgv.EditingControl as ComboBox;                        if (cmb != null)                            cmb.SelectedValue = valueStr;                    }                }            }        }

要注意如下代码:

 

 

ComboBox cmb = dgv.EditingControl as ComboBox;if (cmb != null)   cmb.SelectedValue = valueStr;

此时更新DataGridView数据是指对DataGridView的EditControl(Combobox)的数据更新,

 

如果你直接更新DataGridView的数据,例如:

 

dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = valueStr;

当前Cell的数据会发生改变,但是当EditControl(Combobox)随后提交数据时,

 

因为EditControl(Combobox)的数据没有改变,那么当前Cell的数据还会改为

EditControl(Combobox)的数据,也即当前Cell的原始数据没有改变。

这样就会使你更新DataGridViewComboBoxColumn数据源后,DataGridView当前Cell的值不是你预期的填写的数据项。

而我们直接更改EditControl(Combobox)的数据后,EditControl(Combobox)提交更改为你预期的填写的数据。

所以我们要更改EditControl(Combobox)的数据而不是当前Cell的Value。

 

 

转载地址:http://nsizx.baihongyu.com/

你可能感兴趣的文章
iOS应用跳转到App Store评分
查看>>
图片Ping
查看>>
inode表元数据,存储在物理存储体上
查看>>
点赞效果
查看>>
idea 换主题
查看>>
TreeMap
查看>>
meta 标签的学习
查看>>
lua resty template && openresty 使用
查看>>
java string截取两个字符串之间的值
查看>>
mycat的配置和学习
查看>>
VMWare虚拟机安装创建虚拟机的使用教程
查看>>
Android摄像头测量尺(Advanced Ruler Pro)使用方法
查看>>
HTMl与CSS
查看>>
数学建模-二胎政策对中国人口的影响
查看>>
qscoj 128 喵哈哈村的魔法源泉(2)(模仿快速幂,好题)
查看>>
预发环境与生产环境共享数据库时定时任务重复执行问题解决
查看>>
文件的权限查看
查看>>
UVa 11362 - Phone List
查看>>
Shine.js实现动态阴影效果
查看>>
怎样给你的Android 安装文件(APK)瘦身
查看>>