DataGridView实践(一)
一直以来都是在B/S架构上做开发,记得做C/S架构程序的时候还是个学生,回忆有多远就有多久没做WinForm程序了。最近因为项目需要,不得不要跟WinForm程序再次亲密接触一番了。
说起WinForm程序给我印象最深的就是它的易操作性。虽然现在B/S架构下的技术层出不穷,也能实现WinForm下的易操作功能,想想人家GOOGLE都可以把OFFICE搬到WEB上,还有什么不可能的。但就目前为止WinForm在操作便捷上还是略胜一筹的,这当中要属DataGridView的使用了。
说来惭愧,在做这个项目之前,对WinForm下的DataGridView一无所知,也许是忘记了,毕竟那么多年没碰过它了,生疏那是自然,总之提不起印象来。好家伙,怕什么就来什么。这个项目的第一任务就是要用DataGridView实现数据的增删改,这里指得是就通过DataGridView自身提供的事件机制来实现数据的新增(包括数据的验证)、数据的修改和数据的删除。
"乖乖!不懂!"
不懂谁懂?整个项目就一个人,那也得硬着头皮上,逃避可不是办法,好在现在是21世纪.
"21世纪怎么啦?"
"傻啦,21实际有Internet啊^_^"
找来BAIDU输入DataGridView,看到没有,知识时代就是这么便捷。在众多的搜索结果当中还是选择了MSDN上的资料,毕竟人家是DataGridView的鼻祖,资料应该会使最全最权威的。说干就干。
略去中间的繁琐过程,其实也不繁琐就是软件开发生命周期中的一般步骤,不都这样做得吗?所以咱也这样做了。好了,一切准备就绪,主角该登场了。
首先在IDE(用的是VS2008)拉进来一个DataGridView,设置好相应字段和属性后画面如下:
第一步要做的就是新增数据.
通常我们要新增一笔数据的时候,要有一个事件来驱动,这就是事件驱动给我们带来的便利,在事件后面我们只要实现相应的逻辑就可以了,而不用去管它为什么事件触发后就只会调用这个事件函数而不去调用其他的函数
"这不废话吗?,要不怎么叫事件驱动?"
"多嘴!"
"^_^"
现在新增数据到数据库的逻辑有了.
"那事件呢?要在哪个事件触发后去实现这段逻辑呢"
"不知道!"
"坐以待毙吗?"
"当然不是!"
对了刚搜索到的MSDN网页不还开着吗?看看去,到底都有哪些事件.
乖乖,不看不知道,看了..
"呵呵,老套了"
一堆的事件让我傻眼了..
"这么多?"
"不多哪能叫功能强大?"
"也是.那就先看看再说咯"
以下是从MSDN事件列表的连接
"怎么找..一个一个看?"
"傻人才那么做!"
当然,秉着学习的态度一个一个看,多了解一些也不错.但为了开发速度,可没那么多时间去了解那么多的函数.
凡事讲究策略和技巧.想想,既然是要添加数据,而一行就是代表一个数据对象,那么找有关于行的事件应该有所帮助.说干就干,一看!
"乖乖.."
"咋了?"
"还是有一定数量!"
"多少?"
"不知道,应该有几十个吧"
"哦,那就一个一个看咯"
"傻人才那么做!"
凭经验,觉得通常这个时候向Leave、Enter、Add、Insert等这些字眼应该比较有用,果然不出所料。。一下子找到了几个
RowEnter | 在某一行接收到输入焦点但变成当前行之前发生。 (继承自 DataGridView。) |
RowLeave | 在行失去输入焦点因而不再是当前行时发生。 (继承自 DataGridView。) |
RowsAdded | 在向 DataGridView 中添加新行之后发生。 (继承自 DataGridView。) |
看了下说明,觉得RowLeave这个事件应该挺适用的,一尝试果然能达到预期效果。
可问题来了,也是第二步要做的事,验证数据。
好了,数据是新增到数据库了,可这之前得验证下数据的完整性之类的,不能什么数据都可以往数据库塞吧。
第一个窜进我的大脑的想法是在逻辑层做判断,不符合的抛出异常,在UI层捕获。
可又想,若大的一个DataGridView,号称功能最完善的控件,应该有自己的验证机制吧。。
"傻啦,没有能叫功能强大吗?"
"也对,那就再回头看看"
这个时候有两个事件映进我的眼球
重要角色要出场了
![]() |
RowValidated | 在行完成验证后发生。 (继承自 DataGridView。) |
![]() |
RowValidating | 在验证行时发生。 (继承自 DataGridView。) |
乖乖,这一想乐了,数据新增的动作,不也可以在RowValidate这个事件上处理吗?验证数据完后新增数据,一气呵成,挺顺畅。
"是噢,那就改改!"
"恩,改!"
以下是验证数据和新增数据的代码,希望对大家有点帮助
private void gvCardType_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
{
if (e.RowIndex == gvCardType.Rows.Count - 1)
return;
string validateValue = gvCardType.Rows[e.RowIndex].Cells["CTNo"].FormattedValue.ToString();
if (string.IsNullOrEmpty(validateValue))
{
gvCardType.Rows[e.RowIndex].Cells["CTNo"].ErrorText = "编号不能为空";
e.Cancel=true;
}
validateValue = gvCardType.Rows[e.RowIndex].Cells["CTName"].FormattedValue.ToString();
if (string.IsNullOrEmpty(validateValue))
{
gvCardType.Rows[e.RowIndex].Cells["CTName"].ErrorText = "分类名称不能为空";
e.Cancel = true;
}
}
private void gvCardType_RowValidated(object sender, DataGridViewCellEventArgs e)
{
// Save row changes if any were made and release the edited
// CardTypeInfo object if there is one.
if (e.RowIndex >= _list.Count && e.RowIndex != gvCardType.Rows.Count - 1)
{
// Add the new CardTypeInfo object to the data store.
_list.Add(_cardTypeInEdit);
_cardTypeInEdit = null;
_rowInEdit = -1;
}
else if (e.RowIndex < _list.Count && _cardTypeInEdit != null)
{
// Save the modified CardTypeInfo object in the data store.
_list[e.RowIndex] = _cardTypeInEdit;
_cardTypeInEdit = null;
_rowInEdit = -1;
}
else if (gvCardType.ContainsFocus)
{
_cardTypeInEdit = null;
_rowInEdit = -1;
}
gvCardType.Rows[e.RowIndex].Cells["CTNo"].ErrorText = "";
gvCardType.Rows[e.RowIndex].Cells["CTName"].ErrorText = "";
}
"那么,数据的添加就这样子了吗?"
"当然不是!"
其实理论上来说已经是完成了数据的添加,但在后续的开发中还碰到了其他的问题。
"那就继续啊!"
"什么啊!我又不是机器,肚子饿了总要吃饭吧"
"哦 ,那就下回见咯^_^"