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

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

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

1.使DataGridViewComboBoxCell进入编辑状态,这个很简单。做法如下:
注册DataGridView的EditingControlShowing事件,代码如下:

  1. private void dgv_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
  2. {
  3. DataGridView dgv = sender as DataGridView;
  4. bool isRight =
  5. dgv.CurrentCellAddress.X == ColJCFF.DisplayIndex;
  6. if (isRight)
  7. {
  8. ComboBox cb = e.Control as ComboBox;
  9. if (cb != null)
  10. {
  11. cb.DropDownStyle = ComboBoxStyle.DropDown;
  12. }
  13. }
  14. }

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

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

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

  1. private void dgvMode_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
  2. {
  3. DataGridView dgv = sender as DataGridView;
  4. bool isempty = string.IsNullOrEmpty(e.FormattedValue.ToString());
  5. DataGridViewComboBoxColumn cmbCol = dgv.Columns[e.ColumnIndex] as DataGridViewComboBoxColumn;
  6. if (cmbCol == null)
  7. return;
  8. if (!isempty)
  9. {
  10. bool isCol = dgv.Columns[e.ColumnIndex].Name == cmbCol.Name;
  11. if (isCol)
  12. {
  13. //现有选项中不包含输入数据
  14. if (!cmbCol.Items.Contains(e.FormattedValue))
  15. {
  16. //获取数据源
  17. DataTable dt = cmbCol.DataSource as DataTable;
  18. if (dt == null)
  19. return;
  20. string valueStr = "";//新添加的ID
  21. //判读数据源中是否包含输入数据
  22. DataRow[] rows = dt.Select(cmbCol.DisplayMember + " = '" + e.FormattedValue + "'");
  23. if (rows.Length == 0)//没有包含
  24. {
  25. string guid = GetNewID();//获取新的ID
  26. dt.Rows.Add();
  27. dt.Rows[dt.Rows.Count - 1][1] = e.FormattedValue.ToString();
  28. dt.Rows[dt.Rows.Count - 1][0] = guid;
  29. valueStr = guid;
  30. UpDataMethod(dt);//更新数据
  31. //重新绑定列数据源
  32. BindColumn();
  33. }
  34. else//如果集合内包含此数据
  35. valueStr = rows[0][0].ToString();
  36. //更新DataGridView数据
  37. ComboBox cmb = dgv.EditingControl as ComboBox;
  38. if (cmb != null)
  39. cmb.SelectedValue = valueStr;
  40. }
  41. }
  42. }
  43. }

要注意如下代码:

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

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

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

  1. 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修改后提交数据源的更多相关文章

  1. git 学习笔记 —— 获取远端分支并修改后提交至远端仓库

    笔者最近进行开发过程中,所有参与者的代码需要通过 git 上传到远端仓库中,不同的模块对应不同的 git 分支,不同模块的数据需要从远端仓库中获取.这里记录下笔者从远端仓库中获取分支数据,进行修改,最 ...

  2. PHP代码修改后提交,无法立即生效

    今天遇到一个坑爹的问题,就是我修改了PHP代码,提交到网站根目录以后,刷新浏览器居然无法立即生效,差不多得一分钟的样子再去刷新,才会看到更改后的效果. 出现这个问题的原因,是因为手头的项目需要较高的P ...

  3. ecshop代码修改后提交,无法立即生效

    今天帮一朋友部署一网站.成品的ecshop模版站.在搭建好xammp集成环境,导入数据库,修改配置文件后,报了一大堆错. 其中第一个是关于废弃preg_replace中/e这种用法的,因为存在漏洞,一 ...

  4. repo manifest xml 文件修改后提交命令

    git push origin dev(本地分支):refs/for/tv/Internal_Jb910_develop_t

  5. git fork代码并修改胡提交到自己的git仓库

    最近在参加阿里天池大数据中间件比赛(毫无头绪,打酱油中).看参赛要求,需要将官网的git工程clone下来,在此基础上做修改后提交到自己的仓库中. 由于以前并没有使用过git,所以差了比较多的资料,做 ...

  6. A、B同时打开一个页面进行同一条数据库记录进行修改,A修改完成后提交表单,A修改的数据保存完成后;当B也修改完成后,提交数据进行数据修改。此时B修改的内容会覆盖A修改的内容,请问如何避免?

    A.B同时打开一个页面进行数据中的一条数据进行修改,A修改完成后提交表单,数据修改保存完成后B开始页面也修改完成,开始提交进行修改.此时B修改的内容会覆盖A的内容,请问如何避免? 通过搜索和我个人总结 ...

  7. sourcetree 修改文件后提交上去,文件丢失

    提交sourcetree 修改后,图片资源提交上去了,json文件没提交上去,原因是本地finder隐藏文件.gitignore_global中把一些文件类型都隐藏了不让提交. 具体使用default ...

  8. idea git项目修改后无法提交 颜色都是灰色

    现象: idea git项目修改后无法提交   修改后的文件提交时不显示  颜色都是灰色 分析问题出现的原因: git未识别idea下项目. 排查: 发现是因为这个项目之前是基于svn的,然后直接导入 ...

  9. wamp中修改后mysq数据库l闪退无法登陆解决办法

    WampServer安装后密码是空的,   修改一般有三种方式:   一是通过phpMyAdmin直接修改:   二是使用WAMP的MySql控制台修改.     三是重置密码    第一种:   1 ...

随机推荐

  1. 发一个讨论帖,如果结果被采纳的话可以给一份adb 代码,以及我封装的ADBLIB

    如何在手机没有root 的情况下,获取系统的一些文件,比如 /data/data/xxxx 目录下的文件. 有任何想法的请说出来.

  2. DevExpress ASP.NET 使用经验谈(3)-XPO对象的使用(使用指定数据连接)

    首先,我们贴出上一节Users类XPO对象的保存代码,直接建立的XPO Session会话,因为没有与我们所期望的数据层建立绑定, 所以程序自动创建了一个Access数据库,作为默认数据库操作对象来使 ...

  3. C# Best Practices - Accessing and Using Classes

    References and Using Do: Take care when defining references References must be one way (or circular ...

  4. ubuntu之安装java浏览器插件

    最近搞什么openstack,在浏览器访问远程虚拟机的时候,需要浏览器有支持java.这个之前真没注意过呢, 通过自己的实践写点东西,方便一下你们搞: 1,首先去http://www.java.com ...

  5. BZOJ 2463 谁能赢呢?

           刚开始做这道题时,我纠结了许久什么是最优走法,想了好半天也不晓得,后来被大神点醒,最有走法,最后就是每个格子都走了一遍,得,这下简单多了,算一下总共的格数是奇数还是偶数,奇数则先手赢,偶 ...

  6. python命令行解析工具argparse模块【1】

    argpaser是python中很好用的一个命令行解析模块,使用它我们可以很方便的创建用户友好型命令行程序.而且argparse会自动生成帮助信息和错误信息. 一.示例 例如下面的例子,从命令行中获取 ...

  7. Android——用户登陆及用户名和密码的保存

    Android——用户登陆及用户名和密码的保存   在之前的学习过程中已经将Android学习完了,但是在后面将近一年的时间里都没有进行过Android开发,所以对Android的所有的知识点又有点忘 ...

  8. 一、Linux启动过程详解

    启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬盘 ...

  9. Java疯狂讲义(二)

  10. 基于原生js的图片延迟加载

    当页面图片比较多的时候,我们通常会做一个延迟加载,避免页面打开时一下子的请求数太多,加载过慢影响用户体验. 如果项目用了jquery框架,则可以直接用 jquery.lazyload.可在jquery ...