从零开始用C#做产品:私人日记(18)内容管理界面设计

  上一节我们进行了内容管理的BAL优化,这节开始我们进入这个项目最核心的功能,内容管理界面设计。

  对一个数据库项目来说,最基本的功能就是增删改查,包括后面的扩展功能,也都是基于这些基础功能进行扩展的。

  删除基本不需要做额外的界面,新增/修改可以共用一个界面,我们统一成为内容管理界面,查询即内容查界面。

  所以我们接下来的任务就是两个:内容管理界面、内容查询界面。

  其中Model.Content中的Id、CreateTime、ModifyTime数据是系统自动更新的数据,不需要由用户编辑,所以不在编辑界面中的出现。

  Tags由于是相对独立的功能,可以考虑通过另外的方式呈现。

  剩下由用户参与的数据按合理的布局进行摆放,通过Anchor属性来适应不同尺寸窗口的控件布局。

  然后仿照CategoryForm,由编辑窗口向Model.Content数据进行转换,过程简单,代码就不贴了。

  做好ContentForm之后,我们开始谋划列表页面。列表页面实际上就是在主界面中,左树右表的形式,列表的上方会有一些功能按钮,比如新增、查询等,我们先就从最简单的功能开始,一点点的往上加。

  

  一个新增文章按钮,一个查询按钮,只列这两个控件,因为修改、删除大部分是要针对具体某个文章的,在具体文章处添加功能更合适。至于批量操作,以后有需要再加。

  新增文章和查询的代码都比较简单,不讲了,有需要去Git上看。

  本节新的知识点是上图下面灰色区域的DataGridView控件。

  DataGridView是专门呈现列表数据的,扩展性也不错,涉及到列表展现形式的我们一般都会使用它。

  列头有了,接下来如何进行数据绑定呢?

  DataGridView提供了两种数据绑定方式:

  第一种是手动添加数据。先创建一个数据行,然后再把这个数据行添加到DataGridView中,这种理解起来相对简单,但是不推荐,一旦数据量大点效率会比较低;

  第二种是虚拟模式。为DataGridView指定一个数据源和数据总量,然后响应CellValueNeeded方法,根据当前显示区域,DataGridView会自动回调此方法,要求程序为每个单元格的数据设置值,这种虽然编码稍微麻烦些,但适合用于大量数据的显示。

  具体方法:

  (1)设置DataGridView为虚拟模式:

  

  (2)为DataGridView指定数据量

  List _contents=new List();

  private void btnSearch_Click(object sender, EventArgs e)

  {

  _contents=BAL.Content.query_all();

  dgvContent.RowCount=_contents.Count;

  dgvContent.Invalidate(false);

  }

  点查询按钮,从数据库中查询结果存储到_contents 中,然后将结果数量赋值给dgvContent作为行总量,这样它就可以根据每行学历证的高度和显示界面大小来计算滚动条到什么位置时,应该显示哪些行的数据。最后调用Invalidate(false)进行局部刷新。

  (3)响应CellValueNeeded方法

  private void dgvContent_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)

  {

  Model.Content model=_contents[e.RowIndex] as Model.Content;

  if (model==null) return;

  string v="";

  switch (e.ColumnIndex)

  {

  case 0:

  v=model.Title;

  break;

  case 1:

  {

  v=model.RealTime.ToString("yyyy-MM-dd HH:mm");

  }

  break;

  case 2:

  {

  foreach (Model.Tag tag in model.Tags)

  {

  v +=tag.Name + ",";

  }

  if (!string.IsNullOrEmpty(v)) v=v.Substring(0, v.Length - 1);

  }

  break;

  case 3:

  {

  v=model.Remark;

  }

  break;

  }

  e.Value=v;

  }

  每行每列的单元格值都需要手工赋值,我暂时只需要这4种数据,以后有需要可以再扩充。

  编码完成后,我们运行程序看下效果:

  

  最初查询的3条数据是我之前创建的。至此,我们新增和查询的第一步已经走通了。

  补充说明下上次提交的版本BAL.Content的query_all函数有两个小Bug,Title和SubTitle没有做转换,通过测试发现并修复了。

  当然现在还存在很多肉眼可见不足,比如:

  点左侧分类栏目应自动查询该分类下的内容;内容列表列宽内容应该随界面自动适应;内容列表行需要设置为整行选中状态;修改、删除功能尚未增加;标签功能尚未关联;

  我们将在后面的教程中依次解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值