上一节做到了内容列表控件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上的代码我想应该也跟我一样能做出一个小产品了,到现在为止有没有感觉有一点小小的成就感呢?