使用DATAGRIDVIEW来显示和操作数据库,需要有以下功能:
1.显示数据时,数据来源可能不是来自一个表,比如 工号 和 姓名 两列,工号属于当前表,而与之关联的 姓名 列则属于另一个表。
2.用户并发的问题,在进入DATAGRIDVIEW的一行时,如果是修改状态,则要在数据库中对该行进行锁定,不允许其他用户更改。
3.有些列显示的值会与数据库中的值不同,如果一列使用COMBOBOX控件,DB中存的数据是 0 ,而显示给用户看到的则是 “0:住宅”
4.可以在DATAGRIDVIEW中插入一行,比如在3和4行间插入一行。看到网上说使用 DataAdapter,因为其有Update(),Insert()方法,不用写代码,这当然是最便利的方法,可是当绑定了数据源后,对 DATAGRIDVIEW 的操作就会有很多限制,所以请教大家,请大家帮小弟支个招,使用哪种方法既能满足上述要求又能方便用户操作?先行谢过了。
1.显示数据时,数据来源可能不是来自一个表,比如 工号 和 姓名 两列,工号属于当前表,而与之关联的 姓名 列则属于另一个表。
2.用户并发的问题,在进入DATAGRIDVIEW的一行时,如果是修改状态,则要在数据库中对该行进行锁定,不允许其他用户更改。
3.有些列显示的值会与数据库中的值不同,如果一列使用COMBOBOX控件,DB中存的数据是 0 ,而显示给用户看到的则是 “0:住宅”
4.可以在DATAGRIDVIEW中插入一行,比如在3和4行间插入一行。看到网上说使用 DataAdapter,因为其有Update(),Insert()方法,不用写代码,这当然是最便利的方法,可是当绑定了数据源后,对 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 然后调整序号即可。
有375077人阅读过的一篇很不错的文章
"DATAGRIDVIEW 是数据控件,是绑定数据用的,不是用来操作数据库的。"这句不敢苟同,DATAGRIDVIEW 的强大功能有很大部分就是为了操作数据库设计的,
你的回答太浅了,应对单个功能的实现,你的回答没有问题,但如果把他们打包成一个方案的话,就有所欠缺了。
满足我的要求是前提,还必须考虑用户操作的便利,及使用最精简的代码。
这个相对容易,你做个联合视图即可,再绑定数据源即可!
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 将“智能”更新数据库。
这个要求有点过分,其实你是要求用户界面只允许一个用户进行编辑操作,跟数据库无关!个人觉得这样没有意义:数据库表在同一时刻,本来就有锁定机制,只允许一个操作进行(增、删、改)。如果提交数据库执行,即便是多客户端同时提交,数据库采取等待机制!在提交的那一刻是等待,但在提交之前呢?
比如 某一产品的记录 单位是 g 数量是 1,而这一记录是错误的,
正确的应该是 单位 g 数量是 1000,或 单位 kg 数量是 1,现在要修改这一记录,那么就有两种修改方式,
而恰在这时,有两个用户同时在修改这两个数据,一个修改单位为 KG,一个修改数据为1000,那么最终提交的结果是 单位 kg 数量是 1000,要解决这个冲突,应该在第一个用户在修改这条记录时,对这一行进行锁定(在DATAGRIDVIEW里表现就是光标进入这一行),不允许其他用户这个时候修改。这个应该是数据库的基础吧,啰嗦了。
这个相对容易,你做个联合视图即可,再绑定数据源即可!
这样做了之后再绑定数据源,还能用 DataAdapter,因为其有Update(),Insert()的方法吗?还是要手工写一堆代码?
其实,我非常明白你的想法,想法很好,但不好实现。给你个思路:采用B/S模式:第一个用户开始修改,做个标记,向所有客户端发送这个标记事件,每个客户端接受这个事件,处理