关于DataGridViewComboBoxCell修改后提交数据源
来源:互联网 发布:网络直播教学平台 编辑:程序博客网 时间:2024/06/06 03:32
最近在项目遇到一个功能实现。是在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。
- 关于DataGridViewComboBoxCell修改后提交数据源
- 在DATAGRIDVIEW中使用DataGridViewComboBoxCell绑定数据源
- 关于DataGridView的DataGridViewComboBoxCell错误
- subversion提交后,如何修改log
- TortoiseSVN :提交后,如何修改log
- 修改svn提交后的日志
- git 修改代码后提交到远端
- 表单修改提交后,中文乱码问题
- 二、修改本地文件后提交本地仓库
- tableView 数据源修改后,reloaddata数据没有更新
- Dev GridControl数据修改后实时更新数据源
- 通过javascript修改文本框内容后提交后无效
- 对DataTable(或者DataSet)修改后,提交修改到数据库
- 关于ArcGIS Server修改数据源是否对切片服务有影响
- 给动态数据源的Ext.form.ComboBox设置初始值及提交后怎样取值
- git修改文件后,怎么提交到远程仓库
- 如何把别人项目代码修改后 提交到github
- github从远程库获取修改后提交
- Hive优化----distribute by和sort by
- 双系统重装后的引导项的修复 windows+linux
- hdu4737 A Bit Fun (2013 网络赛 成都赛区)
- cakephp使用心得
- Hive优化----MapJoin 优化
- 关于DataGridViewComboBoxCell修改后提交数据源
- Hive优化----排序
- QWebView Class Reference
- Centos 6.3下安装Oracle 11g R2
- GoAgent GAE平台部署教程
- hdu 4737 A Bit Fun 暴力
- cocos2d-x点滴总结-2
- windows7系统笔记本设置成虚拟WiFi热点(即“无线路由器”)
- Hive优化----利用随机数避免数据倾斜