使用DATAGRIDVIEW来显示和操作数据库,需要有以下功能:
1.显示数据时,数据来源可能不是来自一个表,比如 工号 和 姓名 两列,工号属于当前表,而与之关联的 姓名 列则属于另一个表。
2.用户并发的问题,在进入DATAGRIDVIEW的一行时,如果是修改状态,则要在数据库中对该行进行锁定,不允许其他用户更改。
3.有些列显示的值会与数据库中的值不同,如果一列使用COMBOBOX控件,DB中存的数据是 0 ,而显示给用户看到的则是 “0:住宅”
4.可以在DATAGRIDVIEW中插入一行,比如在3和4行间插入一行。看到网上说使用 DataAdapter,因为其有Update(),Insert()方法,不用写代码,这当然是最便利的方法,可是当绑定了数据源后,对 DATAGRIDVIEW 的操作就会有很多限制,所以请教大家,请大家帮小弟支个招,使用哪种方法既能满足上述要求又能方便用户操作?先行谢过了。

解决方案 »

  1.   

    如果有较成熟的方案,也可以 EMAIL给我 [email protected]
    嫌分少,还可以另外开贴加分
      

  2.   

    DATAGRIDVIEW 是数据控件,是绑定数据用的,不是用来操作数据库的。
    在数据控件上可以删除数据,但是删除实际上还是走的删除的操作。1.显示数据时,数据来源可能不是来自一个表,比如 工号 和 姓名 两列,工号属于当前表,而与之关联的 姓名 列则属于另一个表。
    绑定数据可以用sql脚本,也可以用存储过程,left join 就可以了。
    例如:
    select * from a left join b on a.id=b.id2.用户并发的问题,在进入DATAGRIDVIEW的一行时,如果是修改状态,则要在数据库中对该行进行锁定,不允许其他用户更改。
    数据库中有锁的概念。3.有些列显示的值会与数据库中的值不同,如果一列使用COMBOBOX控件,DB中存的数据是 0 ,而显示给用户看到的则是 “0:住宅”
    这个是你想要什么结果?可以自行处理,例如:
    select ltrim(colname)+':住宅' from tablename4、可以在DATAGRIDVIEW中插入一行,比如在3和4行间插入一行。
    在3和4中间插入一行,可以选中某行,然后选中插入在上面,还是在下面,实际就是
    insert into tablename 然后调整序号即可。
      

  3.   

    DataGridView 数据绑定的一般过程 其实datagridview和gridview都是数据控件,建议你看下gridview72绝技http://blog.csdn.net/21aspnet/article/details/1540301
    有375077人阅读过的一篇很不错的文章
      

  4.   

    谢谢
    "DATAGRIDVIEW 是数据控件,是绑定数据用的,不是用来操作数据库的。"这句不敢苟同,DATAGRIDVIEW 的强大功能有很大部分就是为了操作数据库设计的,
    你的回答太浅了,应对单个功能的实现,你的回答没有问题,但如果把他们打包成一个方案的话,就有所欠缺了。
    满足我的要求是前提,还必须考虑用户操作的便利,及使用最精简的代码。
      

  5.   

    1、“显示数据时,数据来源可能不是来自一个表”:
           这个相对容易,你做个联合视图即可,再绑定数据源即可!
    2、“.用户并发的问题”
          这个要求有点过分,其实你是要求用户界面只允许一个用户进行编辑操作,跟数据库无关!个人觉得这样没有意义:数据库表在同一时刻,本来就有锁定机制,只允许一个操作进行(增、删、改)。如果提交数据库执行,即便是多客户端同时提交,数据库采取等待机制!
    3、“有些列显示的值会与数据库中的值不同”:
         这个倒是不用麻烦数据库,在界面就能处理:
            private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
            {
                try
                {
                    if (e.ColumnIndex == 1)        //控制要格式化的列
                    {
                        int val = Convert.ToInt32(e.Value);
                         switch (val)
                        {
                            case 0:
                                valStr = "0:住宅";
                                break;
                            case 1:
                                valStr = "1:商铺";
                                break;
                            default:
                                break;
                        }              
                        e.Value = valStr;                    //替换格式化值
                        e.FormattingApplied = true;
                    }
                }
                catch (System.Exception ex)
                {
                    e.FormattingApplied = false;
                }
    4、“可以在DATAGRIDVIEW中插入一行”
            这个是有右键菜单,始终插入当前行的上一行,这个你自己肯定会做,对吧。。总之,用DataTable绑定DATAGRIDVIEW ,相互配合很容易实现增、删、改的操作,因为每个行记录都有:
    DataRowState即行状态:
     Added 该行已添加到 DataRowCollection 中,AcceptChanges 尚未调用。  
     Deleted 该行已通过 DataRow 的 Delete 方法被删除。  
     Detached 该行已被创建,但不属于任何 DataRowCollection。DataRow 在以下情况下立即处于此状态:创建之后添加到集合中之前;或从集合中移除之后。  
     Modified 该行已被修改,AcceptChanges 尚未调用。  
     Unchanged 该行自上次调用 AcceptChanges 以来尚未更改。  
    这样,ADO.NET根据这个状态,DataAdapter.Update 将“智能”更新数据库。
      

  6.   

    2、“.用户并发的问题”
      这个要求有点过分,其实你是要求用户界面只允许一个用户进行编辑操作,跟数据库无关!个人觉得这样没有意义:数据库表在同一时刻,本来就有锁定机制,只允许一个操作进行(增、删、改)。如果提交数据库执行,即便是多客户端同时提交,数据库采取等待机制!在提交的那一刻是等待,但在提交之前呢?
    比如 某一产品的记录 单位是 g 数量是 1,而这一记录是错误的,
    正确的应该是 单位 g 数量是 1000,或 单位 kg 数量是 1,现在要修改这一记录,那么就有两种修改方式,
    而恰在这时,有两个用户同时在修改这两个数据,一个修改单位为 KG,一个修改数据为1000,那么最终提交的结果是 单位 kg 数量是 1000,要解决这个冲突,应该在第一个用户在修改这条记录时,对这一行进行锁定(在DATAGRIDVIEW里表现就是光标进入这一行),不允许其他用户这个时候修改。这个应该是数据库的基础吧,啰嗦了。
      

  7.   

    1、“显示数据时,数据来源可能不是来自一个表”:
      这个相对容易,你做个联合视图即可,再绑定数据源即可!
    这样做了之后再绑定数据源,还能用 DataAdapter,因为其有Update(),Insert()的方法吗?还是要手工写一堆代码?
      

  8.   

    锁定要自己写代码  通过事件自动锁定  增、删、改可以直接用DataAdapter实现 
      

  9.   

    楼主,这里有个问题你要自己弄清楚:既然你用联合查询(其实就是视图),那你最好只用来做显示用!因为联合查询对于数据表来说,它们并不是真正的源!要借助datagridview对数据库表进行增删改操作,就针对具体的一个表。根据DataRowState的行状态,DataAdapter.Update 将更新数据库。 
      

  10.   

    使用联合查询和后台sql代码更新数据库!
      

  11.   

    这就对了,联合查询不用能用 DataAdapter.Update 等,那么用什么?哪一种又是更简单的方法?要考虑我其他的要求啊。
      

  12.   

    1、那你把要显示的和需求增删改操作的分开啊,如果你两个融合在一块,只有靠代码来解决了!2、“而恰在这时,有两个用户同时在修改这两个数据,一个修改单位为 KG,一个修改数据为1000,那么最终提交的结果是 单位 kg 数量是 1000,要解决这个冲突,应该在第一个用户在修改这条记录时,对这一行进行锁定(在DATAGRIDVIEW里表现就是光标进入这一行),不允许其他用户这个时候修改。”    看来你还是没理解我的意思,你举的例子:两个用户同时提交,数据库也是一个一个的来,跟一个用户进行两次操作本质是一样的!
        其实,我非常明白你的想法,想法很好,但不好实现。给你个思路:采用B/S模式:第一个用户开始修改,做个标记,向所有客户端发送这个标记事件,每个客户端接受这个事件,处理
      

  13.   

    本帖最后由 caozhy 于 2011-09-21 20:33:36 编辑
      

  14.   

    dataadapter貌似只有在一个表里的时候才简单吧,不然还是要写挺多代码的
      

  15.   

    sdl2005lyx    说的不错,是个行家