从零开始用C#做产品:私人日记 内容管理功能完善

  上一节做到了内容列表控件dgvContent中每行数据的编辑与删除事件响应,这节我们继续完善内容管理功能。

  一、调通编辑功能

  (1) Mainform中

  内容的编辑功能与分类管理的编辑功能是有不同的,内容编辑可能是一个长时间的写作过程,在编辑过程中可能需要数次甚至自动保存当前的内容,以免突然断电或程序意外结束而导致内容丢失。

  所以这块的代码处理也跟分类管理是有不同的,分类管理是可以界面只负责接受数据,具体保存回到MainForm中来完成。但是内容管理就需要在ContentManagementForm中的保存来完成,所以在Mainform中只需要弹出ContentManagementForm即可以了。

  (2)ContentManagerForm中

  为指示保存状态,在ContentManagerForm的左下角位置增加了一个Label控件,专门用于提示操作信息。点保存按钮是根据ContentData的Id是否大于0来判断是修改还是新增,然后提示保存结果,但不退出编辑页面。只有手动点关闭按钮,才会真正执行关闭。

  代码逻辑相对都比较简单,就不在教程体现了。

  另外调试的时候发现,之前的代码有一些写错的地方,均已在新版本中及时修正了,同学们自行到Git上查阅。

  二、调通删除功能

  删除功能与之前的分类管理中的基本一致,不同的是内容删除后,需要对当前的内容列表进行刷新,最简单的方法就是重新查询并刷新,但此时的查询就可能是包含了组合查询条件的,而不是像上一个版本,要么按CategoryId来查询,要么查询全部内容。

  我们需要对BAL.Content查询函数做进一步的复用:

  static public List query(int? categoryId)

  {

  string sql=string.Format("select * from {0} where 1=1", TableName);

  if (categoryId.HasValue && categoryId.Value >=0)

  {

  sql +=string.Format(" and CategoryId={0}", categoryId.Value);

  }

  return query_by_sql(sql);

  }

  static public List query_all()

  {

  return query(null);

  }

  static public List query_by_categoryId(int categoryId)

  {

  return query(categoryId);

  }

  我们新建了一个query的函数,通过默认参数以及字符串拼接的方式,可以对不同条件的查询进行组合,如果以后需要新的查询条件,就在参数后面不断的扩充参数就可以了。针对特定条件的查询,可以使用下面扩展,仍然是只需要维护一份代码就可以。

  同理,在MainForm中的查询函数,我们也做了一次复用处理:

  void search(int? categoryId=null)

  {

  if (!categoryId.HasValue)

  {

  if (tvCategory.SelectedNode !=null)

  {

  Model.Category model=tvCategory.SelectedNode.Tag as Model.Category;

  if (model !=null)

  {

  categoryId=model.Id;

  }

  }

  }

  _contents=BAL.Content.query(categoryId);

  dgvContent_reload();

  }

  总之目的就是实现根据用户当前选择的条件,进行查询

  三、文本编辑功能

  在使用中我们发现,TextBox只能提供文字输入功能,有时我需要加入图片,或改变局部字体大小、颜色等功能,那TextBox就无法胜任了。在WinForm中,.net 自带了一个RichTextBox的控件,可以完成像Word一样的功能,于是我们把ContentManagerForm中的TextBox控件改成RichTextBox。操作就是删掉原来的TextBox,然后拖入一个RichTextBox,控件命名什么的都不需要变。

  RichTextBox与TextBox在使用上稍有不同,TextBox的Text就是控件的全部值,RichTextBox的Text只有文本,没有图片及格式数据,如需要完整的内容数据,需要使用Rtf属性,但是这个Rtf属性中,有大量的特殊字符,直接保存到sqlite数据库会导致语句出错,所以我们需要做下转换。

  在保存数据前编码:

  

  在读取数据后解码:

  

  编码与解码规则可以根据需要自行设置,如Base64编码,如果需要对内容加密,也可以用RSA编码,这里我就用最简单的Url编码,只要能正常保存到数据库中就好。

  

  用兴趣的同学可以尝试使用注释掉的base64编码来实现。

  经过以上内容的改进,现在我们项目已经初步成型了,演示效果如下:

  

  事实上,我们现在已经完成这个项目最主要的功能了。它已经能够满足我之前设想的小目标了:

  1)单机使用;

  2)内容不会被第三方软件获取;

  3)可以分类管理;

  4)可以同时保存文字及图片;

  如果你是从第一章按照教程,再参考Git上的代码我想应该也跟我一样能做出一个小产品了,到现在为止有没有感觉有一点小小的成就感呢?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值