在DevExpress程序中使用Winform分页控件直接录入数据并保存

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在DevExpress程序中使⽤Winform分页控件直接录⼊数据并保存
⼀般情况下,我们都倾向于使⽤⼀个组织⽐较好的独⽴界⾯来录⼊或者展⽰相关的数据,这样处理⽐较规范,也⽅便显⽰⽐较复杂的数据。

不过在⼀些情况下,我们也可能需要直接在GridView表格上直接录⼊或者修改数据,这种对于字段⽐较少,⽽且内容相对⽐较简单的情况下,效率是⽐较⾼的⼀种输⼊⽅式。

本篇随笔主要介绍在DevExpress程序中使⽤GridView直接录⼊数据并保存的实现,以及使⽤Winform分页控件来进⾏数据直接录⼊的实现操作。

1、在GridView上展⽰数据
在GridView上展⽰数据,只需要绑定数据源给对应的GridControl控件即可,⽐较简单,可以绑定的数据格式也是很多,可以是DataTable,也可以⽀持IEnumerable格式的IList<T>集合对象等等,在我的框架中,倾向于使⽤IList<T>这种实体类集合的⽅式。

在⽹上⼤多数例⼦,绑定的数据源多数采⽤的是基于DataTable的⽅式,这种⽅式显⽰的数据受制于不同数据库的特点,字段可能⼤⼩写不⼀样,⽽且DevExpress操作⾏列的字段是⼤⼩写敏感的,因此如果你要字段名获取值的时候,传⼊的字段名⼀定是要⼤⼩写⼀致,因此在数据库不同的时候,如Oracle查询到的字段全部是⼤写的,SQLServer则是混合模式的(可以是Pascal,也可以是⼤写、⼩写)。

采⽤实体类集合对于框架层次的操作有很多好处,可以强类型,⽽且不受具体数据库的影响,所有交互均通过实体类或者其集合进⾏处理,相对来说有很⼤的优势。

⼀般情况下,对实体类的数据源,我们可以通过下⾯的⽅式进⾏数据绑定(使⽤分页控件的数据绑定⽅式)。

List<DictDataInfo> list = BLLFactory<DictData>.Instance.FindWithPager(condition, this.winGridViewPager1.PagerInfo);
this.winGridViewPager1.DataSource = list;
如果需要在GridView上对记录进⾏新增修改的,也就是需要存储绑定数据的状态的,那么就不能直接使⽤List<T>集合,⽽需要使⽤其BindingList<T>的集合,同样BindingList<T>实现了IList<T>接⼝,我们可以通过构造函数new BindingList<T>(list)⽅式进⾏类型转换,然后重新绑定到数据源即可。

修改下上⾯的处理,我们可以得到如下的数据绑定⽅式:
///<summary>
///绑定GridControl控件的数据源
///</summary>
private void BindData()
{
//使⽤BindingList可以进⾏编辑记录,否则⽆法存储新增记录内容
var list = BLLFactory<DictData>.Instance.Find(treeConditionSql);
this.gridControl1.DataSource = new BindingList<DictDataInfo>(list);
}
默认情况下,如果这样绑定,那么字段列名称会是实体类的属性名称,英⽂的,显然这样不太符合我们的显⽰处理,我们需要限定⼏个字段,⽽且需要显⽰中⽂内容,那么我们应该为GridView构建⼏个绑定的列字段才可以。

例如我们可以通过函数进⾏字段列的构建⼯作,如下所⽰。

其中的CreateColumn是为了简化处理模式引⼊的扩展函数,主要就是实现绑定字段的增加的,可以理解为下⾯代码的处理
这样我们绑定数据源后,就可以显⽰指定的⼀些字段内容了,⽽且是中⽂列名称,如下效果所⽰。

2、在GridView上录⼊数据和保存数据
但是,上⾯⼩节只是说明了数据如何绑定显⽰的,如果需要在GridView上直接录⼊数据,那么还需要做⼀些特殊的代码处理的。

在上⾯我们介绍使⽤BindingList<T>的数据源⽅式,确保可以显⽰并录⼊实体类集合数据的,如下代码绑定数据源所⽰。

如果我们需要设置GridView能够直接录⼊数据,那么需要设置下⾯⼏个属性,特别是红⾊那⾏。

grv.OptionsBehavior.ReadOnly = false;
grv.OptionsBehavior.Editable = true;
grv.OptionsView.NewItemRowPosition = NewItemRowPosition.Bottom;
对于⼀些常规的GridView初始化,我们可以通过⼀个扩展函数实现它的属性设置。

grv.InitGridView(GridType.NewItem, false, EditorShowMode.MouseDownFocused);
我们录⼊新的数据⾏时候,往往需要设置⼀些相关的属性,如⽗ID什么的,那么需要在InitNewRow事件⾥⾯进⾏处理,如下所⽰,我们希望在新建记录的时候,保留记录这个记录的⽗ID(来源⾃左侧树节点的ID信息)
其中代码
grv.SetRowCellValue(i, "DictType_ID", typeId);//存储记录的⽗ID
需要我们在这个GridView⾥⾯有⼀个隐藏的字段存在(如本例的DictType_ID字段),否则⽆法存储这个记录内容的。

如果我们需要在录⼊完成某个字段内容后,其他字段也做相应的改变,如触发关联变化,那么可以在CellValueChanged事件进⾏处理,如本例我们希望名称增加后,值和名称⼀致变化,那么代码如下所⽰。

这样我们在界⾯编辑的时候,就可以得到下⾯的效果了。

完成上⾯步骤,如果我们需要在录⼊数据后校验录⼊的信息,并提交数据库处理,如果成功则提⽰,那么就需要在事件ValidateRow⾥⾯进⾏处理了。

校验记录内容,我们可以通过下⾯的代码进⾏处理。

不过⼀般情况下,我们可以使⽤扩展函数来封装这些校验的处理,已达到简化代码的⽬的。

校验通过后提交数据库,我们⾸先需要做的⽅式是定位记录集合⾥⾯当前的记录,把它转换为具体的实体类对象,然后写⼊新记录或者更新处理,如下所⽰。

运⾏程序,并在GridView中录⼊记录后,并逐⼀回车,跳转到新⼀⾏的时候,触发数据校验和保存操作,保存成功后提⽰⽤户,并可以继续录⼊新的记录,⾮常⽅便,这个就是使⽤GridView直接录⼊数据并保存的⽅便地⽅。

结合GridControl的右键菜单,我们可以实现数据的删除、打印、导出等常规的功能整合。

3、基于Winform分页控件的数据展⽰和录⼊
在数据记录⽐较少的情况下,直接使⽤GridView进⾏展⽰全部记录,没有什么问题。

但是在数据记录⽐较多的时候,如果⽤GridView全部展开所有的记录,会⽐较影响性能,⽐较好的⽅式就是对数据进⾏适当的分页。

在Winform开发中,我们使⽤封装好的分页控件来展⽰数据,这个分页的特性已经整合在Winform开发框架、混合式开发框架等框架底层⾥⾯了,直接调⽤相应的框架业务类⽅法,即可获取对应业务表的分页记录,⾮常⽅便。

前⾯两个⼩节都是基于原⽣的GridView控件对象进⾏数据的展⽰和录⼊,分页控件本⾝也是封装GridView控件的,因此也是可以直接利⽤它来进⾏数据的录⼊处理的。

使⽤分页控件,可以⾼效提⾼数据的查询速度,另外可以利⽤代码⽣成⼯具Database2Sharp⼯具进⾏快速开发好Winform界⾯,然后进⾏⼀定的修改即可,⾮常⽅便。

我们来看看使⽤分页控件做的数据展⽰和录⼊界⾯效果图。

利⽤分页控件的⽅式和前⾯的直接使⽤GridView的⽅式⼤同⼩异,只是⼀些细节处理上进⾏修改即可。

分页控件,在利⽤代码⽣成⼯具Database2Sharp的Winform界⾯⽣成的时候,⾃动带有下⾯的分页控件初始化代码,我们屏蔽其中的新增和编辑处理事件,因为我们使⽤直接录⼊的⽅式,不需要弹出对话框进⾏处理。

代码如下所⽰。

由于我们使⽤分页控件,其在数据绑定的时候,列是⾃动创建的,因此我们不需要为GridView指定数据列,我们使⽤分页控件后的InitGridView的代码如下所⽰。

///<summary>
///初始化GridView
///</summary>
private void InitGridView()
{
var grd = this.winGridViewPager1.gridControl1;
var grv = this.winGridViewPager1.gridView1;
#region GridView控件初始化
grv.InitGridView(GridType.NewItem, false, EditorShowMode.MouseDownFocused, "");
grv.InitNewRow += delegate(object sender, InitNewRowEventArgs e)
{
//数据记录初始化的时候,设置ID和⽗节点的ID
if (this.tree.FocusedNode != null)
{
var i = e.RowHandle;
var typeId = this.tree.FocusedNode.GetValue("ID");
grv.SetRowCellValue(i, "ID", Guid.NewGuid().ToString());
grv.SetRowCellValue(i, "DictType_ID", typeId);//存储记录的⽗ID
}
};
grv.CellValueChanged += delegate(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
{
//如果字段的值发⽣改变,触发其他值改变则在此处理
if (e.Column.FieldName == "Name")
{
string value = string.Concat(grv.GetRowCellValue(e.RowHandle, "Value"));
if (string.IsNullOrEmpty(value))
{
grv.SetRowCellValue(e.RowHandle, "Value", e.Value);
}
}
};
grv.ValidateRow += delegate(object sender, ValidateRowEventArgs e)
{
var result = grd.ValidateRowNull(e, new string[]
{
"Name"
});
//校验通过后提交数据库
if (result)
{
//获取当前操作的记录对象
var info = grv.GetFocusedRow() as DictDataInfo;
//如果记录对象⾮空,则可以写⼊或者更新
if (info != null)
{
result = BLLFactory<DictData>.Instance.InsertUpdate(info, info.ID);
//如果不能写⼊,提⽰⽤户
if (!result)
{
e.Valid = false;
e.ErrorText = string.Format("写⼊数据出错");
}
else
{
base.ShowMessageAutoHide();
}
}
}
};
#endregion
}
绑定数据源的⽅法BindData和直接⽣成的代码没有太⼤的差别,只是把GridView设置为可编辑即可,代码如下所⽰。

这样我们就可以实现基于Winform分页控件的基础上进⾏数据的直接录⼊操作了,处理⽅式就是先利⽤代码⽣成⼯具Database2Sharp进⾏Winform界⾯⽣成,然后进⾏微调代码即可,⾮常⽅便就可以实现这种快捷的数据录⼊了。

4、基于主从表数据录⼊的处理
在前⾯的记录保存和显⽰⾥⾯,都是采⽤⼀个视图的⽅式进⾏数据的展⽰和录⼊的,如果对于主从表的记录同时录⼊,那么就需要主从表两个GridView来进⾏展⽰和数据录⼊的了,对于主从表录⼊相对复杂⼀些,具体如何操作呢?
这⾥我们依旧采⽤分页控件来进⾏数据的分页及直接录⼊数据操作,⽽且增加了主从表数据同时在⼀个GridControl界⾯上进⾏处理。

这样主表记录为字典类型,从表为字典明细项⽬,得到的数据展⽰界⾯效果如下所⽰。

当然我们可直接在底部进⾏数据的录⼊,包括主表记录和从表的明细记录,都可以⼀⽓呵成的录⼊并进⾏保存处理的,界⾯效果如下所⽰。

GridView的主从关系需要设置好集合的映射关系,我们需要通过设置GridLevelNode集合实现主从表关系的处理的。

初始化从表的GridView2和主从表关系的代码如下所⽰
通过上⾯的初始化代码,指定了主从表的关系后,我们还需要对绑定的数据源进⾏⼀定的处理,才能够在GridControl控件上显⽰主从表关系的记录。

⾸先需要定义⼀个业务对象,⽤来存储主从关系的记录对象。

然后在BindData绑定数据的时候,代码处理如下即可。

这样就可以得到开始介绍的主从表界⾯效果了。

数据保存的代码和前⾯的操作类似,我们需要分别对GridView1和GridView2的数据保存操作进⾏处理,如下代码所⽰。

GridView2的字典项⽬明细保存操作如下所⽰。

主从表的记录删除这⾥需要顺带介绍⼀下,由于主从表公⽤⼀个右键菜单的删除操作。

那么处理的时候,我们需要判断是操作从表还是主表记录,对它们要分开处理,然后提⽰是否操作成功,如果成功,我们可以移除这⾏即可,避免重新更新数据导致的焦点丢失。

以上就是介绍各种在GridView界⾯上直接录⼊数据并保存的处理操作,虽然⼀般情况下⾯,我们建议通过独⽴的弹出界⾯进⾏内容的展⽰和录⼊,但是对于⼀些字段较少,或者喜欢直接录⼊记录的⽤户来说,这种⽅式也是⼀种⾮常不错的体验效果,也可以达到快速录⼊的⽬的,可以把这种⽅式作为我开发框架数据⾮常规录⼊的补充。

相关文档
最新文档