关于DataGridViewComboBoxCell修改后提交数据源
最近在项目遇到一个功能实现。是在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修改后提交数据源的更多相关文章
- git 学习笔记 —— 获取远端分支并修改后提交至远端仓库
笔者最近进行开发过程中,所有参与者的代码需要通过 git 上传到远端仓库中,不同的模块对应不同的 git 分支,不同模块的数据需要从远端仓库中获取.这里记录下笔者从远端仓库中获取分支数据,进行修改,最 ...
- PHP代码修改后提交,无法立即生效
今天遇到一个坑爹的问题,就是我修改了PHP代码,提交到网站根目录以后,刷新浏览器居然无法立即生效,差不多得一分钟的样子再去刷新,才会看到更改后的效果. 出现这个问题的原因,是因为手头的项目需要较高的P ...
- ecshop代码修改后提交,无法立即生效
今天帮一朋友部署一网站.成品的ecshop模版站.在搭建好xammp集成环境,导入数据库,修改配置文件后,报了一大堆错. 其中第一个是关于废弃preg_replace中/e这种用法的,因为存在漏洞,一 ...
- repo manifest xml 文件修改后提交命令
git push origin dev(本地分支):refs/for/tv/Internal_Jb910_develop_t
- git fork代码并修改胡提交到自己的git仓库
最近在参加阿里天池大数据中间件比赛(毫无头绪,打酱油中).看参赛要求,需要将官网的git工程clone下来,在此基础上做修改后提交到自己的仓库中. 由于以前并没有使用过git,所以差了比较多的资料,做 ...
- A、B同时打开一个页面进行同一条数据库记录进行修改,A修改完成后提交表单,A修改的数据保存完成后;当B也修改完成后,提交数据进行数据修改。此时B修改的内容会覆盖A修改的内容,请问如何避免?
A.B同时打开一个页面进行数据中的一条数据进行修改,A修改完成后提交表单,数据修改保存完成后B开始页面也修改完成,开始提交进行修改.此时B修改的内容会覆盖A的内容,请问如何避免? 通过搜索和我个人总结 ...
- sourcetree 修改文件后提交上去,文件丢失
提交sourcetree 修改后,图片资源提交上去了,json文件没提交上去,原因是本地finder隐藏文件.gitignore_global中把一些文件类型都隐藏了不让提交. 具体使用default ...
- idea git项目修改后无法提交 颜色都是灰色
现象: idea git项目修改后无法提交 修改后的文件提交时不显示 颜色都是灰色 分析问题出现的原因: git未识别idea下项目. 排查: 发现是因为这个项目之前是基于svn的,然后直接导入 ...
- wamp中修改后mysq数据库l闪退无法登陆解决办法
WampServer安装后密码是空的, 修改一般有三种方式: 一是通过phpMyAdmin直接修改: 二是使用WAMP的MySql控制台修改. 三是重置密码 第一种: 1 ...
随机推荐
- C功底挑战Java菜鸟入门概念干货(二)
(接上篇博文:C功底挑战Java菜鸟入门概念干货(一)) 一.Java面向对象程序设计-类的基本形式 1.“类”是把事物的数据与相关的功能封装在一起,形成的一种特殊结构,用以表达对真实世界的一种抽象概 ...
- java软件工程师成长过程的学习
第一阶段:Java基础,包括java语法,面向对象特征,常见API,集合框架: *第二阶段:java界面编程,包括AWT,事件机制,SWING,这个部分也可以跳过,用的时候再看都能来及: *第三阶段: ...
- http动态调用webserive
前言 传统方式调用WebService是直接引用服务,生成客户端代理类类,这种方式将ws进行了再次封装,并以代理的方式进行调用,这种方式的优点是简单,方便. 但是此种方式不足的地方是,当对方ws接口变 ...
- 分页:T-SQL存储过程和EF存储过程的使用
首先准备好分页的T-SQL语句: create proc usp_activityFenYe @pageIndex int, @pageSize int, @pageCount int output ...
- Hive环境搭建心得(Ubuntu)
Hive是什么? 基于Hadoop的数据查询工具,可以使用类SQL进行数据查询. Hadoop安装 参考了Hadoop安装 注意到etc/hadoop/hadoop-env.sh里设置JAVA_HOM ...
- debian下samba配置
debian下samba配置 http://blog.chinaunix.net/uid-2282111-id-2113216.html 服务器端配置过程:1. apt-get install sa ...
- javascript学习(9)——[设计模式]单例
单例模式,相信大家对此都不陌生,我们主要讲下javascript中几个比较常见的设计模式: (1).普通的单体 (2).具有局部变量的强大单体 (3).惰性单体 (4).分支单体 下面我们就一一进行介 ...
- HTML5 总结-表单-输入类型
HTML5 Input 类型 HTML5 新的 Input 类型 HTML5 拥有多个新的表单输入类型.这些新特性提供了更好的输入控制和验证. 本章全面介绍这些新的输入类型: email url nu ...
- web测试 结果存储类型为“Database”,但尚未指定结果储存库连接字符串
vs2010 Ultimate版带有web测试功能,可以对网站的性能以及负载进行测试. 在进行负载测试时提示“异常 LoadTestConnectStringMissingException 1 Lo ...
- springMVC框架下JQuery传递并解析Json数据
springMVC框架下JQuery传递并解析Json数据