点击获取工具 >>
在 Winform 开发中,咱们往往除了惯例的单表信息录入外,有时候设计到多个主从表的数据显示、编辑等界面,单表的信息个别就是控件和对象实体一一对应,而后调用 API 保留即可,主从表就须要另外非凡解决,本随笔介绍如何疾速实现主从表编辑界面的解决,联合 GridControl 控件的 GridView 控件对象,实现数据在列表中的实时编辑,十分不便。
一、主从表的界面设计及展现
主从表个别波及两个以上的表,一个是主表,其余的是从表的,在理论状况下,个别蕴含两个表较多,咱们这里以两个表的主从表关系进行剖析解决。
例如咱们建设两个报销申请单表关系如下所示。
对于报销的主从表信息,咱们能够在列表中进行展现,如下界面所示,分为两局部:一部分是主表信息,一部分是从表信息,单击主表信息后,显示对应从表的列表信息。
那么咱们新增一条主表记录的时候,那么能够弹出一个新的界面进行数据的保护解决,不便咱们录入主从表的信息,界面如下所示。
下面界面包含了主表信息,以及从表的信息(在 GridView 中实时录入)两局部,这样填写后对立进行提交解决。
二、主从表编辑界面的解决
这里次要介绍一下主从表的编辑界面解决,也就是下面这个界面的实现解决。
其中初始化 GridView 的代码如下所示。
`/// <summary>
/// 初始化明细表的 GridView 数据显示
/// </summary>
private void InitDetailGrid()
{
// 初始清空列
this.gridView1.Columns.Clear();
// 设置局部列暗藏
this.gridView1.CreateColumn(“ID”, “ 编号 ”).Visible = false;
this.gridView1.CreateColumn(“Header_ID”, “ 主表编号 ”).Visible = false;
this.gridView1.CreateColumn(“Apply_ID”, “ 申请单编号 ”).Visible = false;
// 增加下拉列表列,并绑定数据源
this.gridView1.CreateColumn(“FeeType”, “ 费用类型 ”, 100).CreateComboBox().BindDictItems(“ 费用类型 ”);
// 创立日期列并指定格局
var OccurTime = this.gridView1.CreateColumn(“OccurTime”, “ 产生工夫 ”, 120).CreateDateEdit();
OccurTime.EditMask = “yyyy-MM-dd HH:mm”;
OccurTime.DisplayFormat.FormatString = “yyyy-MM-dd HH:mm”;
// 创立数值列
this.gridView1.CreateColumn(“FeeAmount”, “ 费用金额 ”).CreateSpinEdit();
// 创立备注列
this.gridView1.CreateColumn(“FeeDescription”, “ 费用阐明 ”, 200).CreateMemoEdit();
// 初始化 GridView,能够新增列
this.gridView1.InitGridView(GridType.NewItem, false, EditorShowMode.MouseDownFocused, “”);
// 本义列内容显示
this.gridView1.CustomColumnDisplayText += new CustomColumnDisplayTextEventHandler(gridView1_CustomColumnDisplayText);
// 处理单元格的款式
this.gridView1.RowCellStyle += new RowCellStyleEventHandler(gridView1_RowCellStyle);
// 不容许头部排序
this.gridView1.OptionsCustomization.AllowSort = false;
// 绘制序号
this.gridView1.CustomDrawRowIndicator += (s, e) =>
{
if (e.Info.IsRowIndicator && e.RowHandle >= 0)
{
e.Info.DisplayText = (e.RowHandle + 1).ToString();
}
};
// 对输出单元格进行非空校验
this.gridView1.ValidateRow += delegate(object sender, ValidateRowEventArgs e)
{
var result = gridControl1.ValidateRowNull(e, new string[]
{
“FeeType”
});
};
// 新增行的内容初始化
this.gridView1.InitNewRow += (s, e) =>
{
gridView1.SetRowCellValue(e.RowHandle, “ID”, Guid.NewGuid().ToString());
gridView1.SetRowCellValue(e.RowHandle, “Header_ID”, tempInfo.ID);
gridView1.SetRowCellValue(e.RowHandle, “Apply_ID”, tempInfo.Apply_ID);
gridView1.SetRowCellValue(e.RowHandle, “OccurTime”, DateTime.Now);
};
}
void gridView1_RowCellStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowCellStyleEventArgs e)
{
GridView gridView = this.gridView1;
if (e.Column.FieldName == “FeeAmount”)
{
e.Appearance.BackColor = Color.Green;
e.Appearance.BackColor2 = Color.LightCyan;
}
}
void gridView1_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e)
{
string columnName = e.Column.FieldName;
if (e.Column.ColumnType == typeof(DateTime))
{
if (e.Value != null)
{
if (e.Value == DBNull.Value || Convert.ToDateTime(e.Value) <= Convert.ToDateTime(“1900-1-1”))
{
e.DisplayText = “”;
}
else
{
e.DisplayText = Convert.ToDateTime(e.Value).ToString(“yyyy-MM-dd HH:mm”);//yyyy-MM-dd
}
}
}
}`
下面代码都有具体的备注,次要就是咱们依据数据库表的关系,创立对应显示的字段即可,其中有须要暗藏的那么就不要显示(不便获取对应的值)
`// 设置局部列暗藏
this.gridView1.CreateColumn(“ID”, “ 编号 ”).Visible = false;
this.gridView1.CreateColumn(“Header_ID”, “ 主表编号 ”).Visible = false;
this.gridView1.CreateColumn(“Apply_ID”, “ 申请单编号 ”).Visible = false;`
如果须要绑定下拉列表相似的字段,那么创立对应的数据类型,而后调用绑定函数绑定即可,如上面代码
`// 增加下拉列表列,并绑定数据源
this.gridView1.CreateColumn(“FeeType”, “ 费用类型 ”, 100).CreateComboBox().BindDictItems(“ 费用类型 ”);`
如果是一些非凡的输出须要设置格局显示或者掩码,那么如下所示
`// 创立日期列并指定格局
var OccurTime = this.gridView1.CreateColumn(“OccurTime”, “ 产生工夫 ”, 120).CreateDateEdit();
OccurTime.EditMask = “yyyy-MM-dd HH:mm”;
OccurTime.DisplayFormat.FormatString = “yyyy-MM-dd HH:mm”;`
另外有一个值得注意的就是咱们新增一行从表记录的时候,须要记录一些主表的属性,这样的话,咱们就是在行初始化的时候,赋值给从表的暗藏列即可。
`// 新增行的内容初始化
this.gridView1.InitNewRow += (s, e) =>
{
gridView1.SetRowCellValue(e.RowHandle, “ID”, Guid.NewGuid().ToString());
gridView1.SetRowCellValue(e.RowHandle, “Header_ID”, tempInfo.ID);
gridView1.SetRowCellValue(e.RowHandle, “Apply_ID”, tempInfo.Apply_ID);
gridView1.SetRowCellValue(e.RowHandle, “OccurTime”, DateTime.Now);
};`
在界面中如果咱们须要显示主表的信息,那么就依据条件获取对应的主表记录对象,而后显示给界面控件即可。
`/// <summary>
/// 显示惯例的对象内容
/// </summary>
/// <param name=”info”></param>
private void DisplayInfo(ReimbursementInfo info)
{
tempInfo = info;// 从新给长期对象赋值,使之指向存在的记录对象
txtCategory.Text = info.Category;
txtReason.Text = info.Reason;
txtTotalAmount.Value = info.TotalAmount;
txtNote.Text = info.Note;
}`
而保留的时候,咱们把界面内容从新赋值给对应的主表对象。
`/// <summary>
/// 编辑或者保留状态下取值函数
/// </summary>
/// <param name=”info”></param>
private void SetInfo(ReimbursementInfo info)
{
info.Category = txtCategory.Text;
info.Reason = txtReason.Text;
info.TotalAmount = txtTotalAmount.Value;
info.Note = txtNote.Text;
info.ApplyDate = DateTime.Now;
info.ApplyDept = base.LoginUserInfo.DeptId;
info.CurrentLoginUserId = base.LoginUserInfo.ID;
}`
而咱们须要获取 GridView 明细输出的时候,就通过一个函数遍历获取 GridView 的行记录,转换为相应的对象即可,如下所示。
`/// <summary>
/// 获取明细列表
/// </summary>
/// <returns></returns>
private List<ReimbursementDetailInfo> GetDetailList()
{
var list = new List<ReimbursementDetailInfo>();
for (int i = 0; i < this.gridView1.RowCount; i++)
{
var detailInfo = gridView1.GetRow(i) as ReimbursementDetailInfo;
if (detailInfo != null)
{
list.Add(detailInfo);
}
}
return list;
}`
这样解决完这些信息后,咱们就能够在主表保留的时候,同时保留明细表信息即可。
`/// <summary>
/// 新增状态下的数据保留
/// </summary>
/// <returns></returns>
public override bool SaveAddNew()
{
ReimbursementInfo info = tempInfo;// 必须应用存在的局部变量,因为局部信息可能被附件应用
SetInfo(info);
info.Creator = base.LoginUserInfo.ID;
info.CreateTime = DateTime.Now;
try
{
region 新增数据
bool succeed = BLLFactory<Reimbursement>.Instance.Insert(info);
if (succeed)
{
// 可增加其余关联操作
var list = GetDetailList();
foreach(var detailInfo in list)
{
BLLFactory<ReimbursementDetail>.Instance.InsertUpdate(detailInfo, detailInfo.ID);
}
return true;
}
endregion
}
catch (Exception ex)
{
LogTextHelper.Error(ex);
MessageDxUtil.ShowError(ex.Message);
}
return false;
}`
其中代码
BLLFactory<ReimbursementDetail>.Instance.InsertUpdate(detailInfo, detailInfo.ID);
能够对新增记录保留,也能够对存在的记录进行更新。
通过下面的介绍,咱们能够看到不同的主从表其实逻辑还是很通用的,咱们能够把它们的逻辑抽取进去,通过代码生成工具进行疾速生成即可。
本文转载自博客园 - 伍华聪