【原创】自己动手写工具----随手记(最终版)

一、前面的话

在上一篇自己动手写工具----随手记中,我简单介绍了这个小玩意儿的大致界面和要实现的功能,看了一下园子里的评论,评价褒贬不一,有人说“现在那么多云笔记的工具”,“极简版evernote”,我想说的是,别人的工具再好用,终究不是自己写的,其实写这个的目的,一方面是锻炼自己的技术能力,在coding的时候,或多或少会遇到一些问题,在解决这些问题的过程中,技术能力就会有所提升;另一方面,写这个东西还有自己个人原因,可以随时记录一些繁杂的知识点,通过给这些知识点打上标签,可以实现归类,那有的人会说,EverNote呢?嗯,如果你用着自己写的软件和用EverNote,哪个会更有成就感呢?好了,不多说,上图上代码!!

这个小东西基本上实现了上一篇中列出的功能,添加note、note分类、为note加标签、根据标签对note进行筛选等。下面介绍各个功能点(大神手下留情%>_<%)... ...

二、功能

1.添加note

首先在界面的右上角会提示您目前选择的树结构节点,如果新添加note就必须选择该note的所属目录(左侧的树节点),否则会因为找不到所属目录而导致添加note失败,如下图:

这样,新增的note就会自动归类为DOT NET文件夹下咯~

 1         private void btn_Save_Click(object sender, EventArgs e)
 2         {
 3             TreeNode node = tv_Folder.SelectedNode;
 4             TipsForm tf = new TipsForm();
 5             if (node == null)
 6             {
 7                 return;
 8             }
 9             if (node.Tag.ToString() == Enums.LEAVES.ToString())
10             {
11                 //同时更新标题和内容
12                 int i = SQLHelper.UpdateContent(node.Name.ToInt(), txt_Title.Text, txt_Content.Text);
13                 //同时重新加载Treeview
19                 BuildTree(this.tv_Folder, GetFolderSet());
20                 if (i > 0)
21                 {
22                     tf.Show("保存成功!");
23                 }
24             }
25         }

由于建立新note时,note的ID就确定了,所以只要根据ID来更新几个字段就可以了。所以上面是更新操作而不是插入操作。

1         //更新标题及内容
2         public static int UpdateContent(int id,string title,string content)
3         {
4             int result = -1;
5             StringBuilder cmd = new StringBuilder();
6             cmd.Append(string.Format("update Table_Content set Content = ‘{0}‘,Title=‘{1}‘  where Id={2}",content,title,id));
7             return NonQuery(cmd, result);
8         }

2.为note分类

这个比较简单了,只要在添加的时候指定好note的所属目录就可以了,单击目录时,右侧下方的预览区会显示出该目录下的所有note,并且最上方的标签区域显示该目录下所有的note包含的标签~

3.为note指定标签

为note指定标签的过程实际上是向关联note和标签的表中加入数据的过程,这里note和标签是多对多的关系,所以需要单独建立一个关系表。

为note加标签,是通过自定义控件LabelWithCheck的选中事件触发的,而且LabelWithCheck是在初始化时动态生成并且动态绑定事件的。

 1         public void AddLabelToLocation(FlowLayoutPanel flp, int column, string tag, int Id, bool ischecked,bool registerEvent)
 2         {
 3             //int flag = 0;
 4             int labelCount = flp.Controls.Count;
 5             int lines = labelCount / column;
 6             int left = labelCount % column;
 7             int X = (left * WIDTH) + (left + 1) * MARGIN;
 8             int Y = lines * HEIGHT + (lines + 1) * MARGIN;
 9             LabelWithCheck label = new LabelWithCheck();
10             //注册事件
11             if (registerEvent)
12             {
13                 label.LabelCheckedEvent += Label_LabelCheckedEvent;
14                 //new TipsForm().Show("注册插入数据库事件");
15             }
16             else
17             {
18                 label.LabelCheckedEvent += Label_LabelSelectEvent;
19                 //new TipsForm().Show("注册过滤事件");
20             }
21
22             label.BackColor = ColorTranslator.FromHtml(ColorManager.ColorConvertor(flagForPanelEdit));
23             label.Location = new Point(X, Y);
24             label.LabelText = tag;//存储标签名称
25             label.Id = Id;//存储标签ID
26             label.LabelChecked = ischecked;//选中状态
27             flp.Controls.Add(label);
28             flagForPanelEdit++;
29             if (flagForPanelEdit > 19)
30             {
31                 flagForPanelEdit = 0;
32             }
33         }

下面是自定义控件LabelWithCheck的代码,重绘LabelWithCheck

 1         #region OVERRIDE
 2         protected override void OnPaint(PaintEventArgs e)
 3         {
 4             Graphics g = e.Graphics;
 5             int x = this.Width;
 6             int y = this.Height;
 7             Point leftTop = new Point(0, 0);
 8             Point rightTop = new Point(x - 1, 0);
 9             Point leftBottom = new Point(0, y - 1);
10             Point rightBottom = new Point(x - 1, y - 1);
11
12             g.DrawLine(new Pen(Color.White), leftTop, rightTop);
13             g.DrawLine(new Pen(Color.White), leftBottom, rightBottom);
14             g.DrawLine(new Pen(Color.White), leftTop, leftBottom);
15             g.DrawLine(new Pen(Color.White), rightTop, rightBottom);
16             //画上边缘
17             for (int i = 0; i < x - 1; i += 3)
18             {
19                 g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(i, 0, 2, 1));
20             }
21
22             //画下边缘
23             for (int m = 0; m < x - 1; m += 3)
24             {
25                 g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(m, y - 1, 2, 1));
26             }
27
28             //画左边缘
29             for (int i = 0; i < y - 1; i += 3)
30             {
31                 g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(0, i, 1, 2));
32             }
33
34             //画右边缘
35             for (int i = 0; i < y - 1; i += 3)
36             {
37                 g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(x - 1, i, 1, 2));
38             }
39             base.OnPaint(e);
40         }
41         #endregion

定义LabelWithCheck控件的事件,为note添加标签的时候就触发这个事件,参数中包括了标签的一些信息

        #region EVENT
        public delegate void LabelWithCheckSelectedHandler(object sender, LabelWithCheckEventArgs e);
        public event LabelWithCheckSelectedHandler LabelCheckedEvent;
        private void ck_CheckedChanged(object sender, EventArgs e)//checkBox原型
        {
            if (LabelCheckedEvent != null)
            {
                LabelCheckedEvent(sender, new LabelWithCheckEventArgs(this._Id,this.LabelText));
            }
        }
        #endregion

每选择一个LabelWithCheck都会动态添加该控件

1         private void Label_LabelSelectEvent(object sender, LabelWithCheckEventArgs e)
2         {
3             AddLabelToLocation(flowLayoutPanel2,6,e.LabelText,e.Id,false,false); //Stack Overflow 重复绑定重复执行 形成无限循环导致
4         }

4.根据目录和标签筛选

这一部分还没有仔细地去做,目前只是大概地处理了一下,最近实在太忙了。大概的筛选原则就是右侧上方的两个标签区域的交集,只要符合条件就会在下面的预览区域显示出来,也就是我们想要看到的结果啦~

上面一排是所选的目录下所有note包含的所有的标签,下面是手工指定的标签,通过筛选条件的就会出现在下面的note预览区域中

三、结语

本来这个小东西早就该完成,但是中间公司又分配了些项目,没有太多的空闲时间,今天抽空把他总结出来,对自己也有个交代。在写这个玩意儿的时候,的确遇到了一些小问题,如左侧树状结构绑定同一张表中带有层级结构的数据,这是第一次接触,但是掌握了方法就OK了;还有自定义控件的动态添加和绑定事件等等。如果您有什么建议,欢迎评论,大神勿拍... ...如果觉得好玩儿,就给个赞吧~~

2014马上过去了,不得不说时间飞快,祝各位园友在新的一年里,能够实现升职加薪,出任CTO,迎娶白富美,走向人生巅峰,~\(≧▽≦)/~

作者:湫楓 謃箜

博客地址:http://www.cnblogs.com/xhb-bky-blog/p/4167108.html

声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。

时间: 2024-11-10 01:06:59

【原创】自己动手写工具----随手记(最终版)的相关文章

【原创】自己动手写工具----随手记

一.背景 有个朋友是在他们单位的市场部,手里的策划文案以及PPT,少则数百,多则上千,多年下来也是一笔不可小觑的财富,每一次新的策划都可以从以往的文案或PPT中“拿来主义”,有着很好的借鉴意义,但是这么多的材料,如果挨个翻看还不得累死.我们知道每个Word或者PPT打开至少要4秒钟(我的电脑是这样,配置不赖),那几百个下来什么也不用做了,时间都在打开这些材料中度过了.而记录这些东西,又不需要花费专门的精力,只要想记下来,copy,paste,加上标签便于检索就OK啦~于是这个小玩意儿就产生啦~\

【原创】自己动手写工具----XSmartNote [Beta 3.0]

一.前面的话 在动笔之前,一直很纠结到底要不要继续完成这个工具,因为上次给它码代码还是一年多之前的事情,参考自己动手写工具----XSmartNote [Beta 2.0],这篇博文里,很多园友提出了宝贵的意见.最后决定吸收园友的建议把这个工具重构一下.首先给它换了个名 称,XSmartNote.因为各种自身的原因,并没有完成这个工具的基本功能,只是实现了基本的框架.最近有点时间就搞了一下,权当做打下基础.本来想用B/S结构来重新搞一下,毕竟园子里有很多大牛都是专注于ASP.NET MVC,但仔

【原创】自己动手写工具----签到器(升级版)

一.前面的话 上一篇中基本实现了简单的签到任务,但是不够灵活.在上一篇自己动手写工具----签到器的结尾中,我设想了几个新增功能来提高工具的灵活程度,下面把新增功能点列出来看看: (1)新增其他的进程任务: (2)任务按照进程进行分类:用IE就是执行IE的任务,与其他(如资源管理器等)无关: (3)每执行完一个任务关闭任务窗口: (4)对签到性质的任务进行”已签到“过滤: (5)实现执行的任务列表自定义: (6)另外实现任务的可视化: 还是先来看看效果图: 二.签到器的改进 在上一个版本中,(自

自己动手写工具:百度图片批量下载器

开篇:在某些场景下,我们想要对百度图片搜出来的东东进行保存,但是一个一个得下载保存不仅耗时而且费劲,有木有一种方法能够简化我们的工作量呢,让我们在离线模式下也能爽爽地浏览大量的美图呢?于是,我们想到了使用网络抓取去帮我们去下载图片,并且保存到我们设定的文件夹中,现在我们就来看看如何来设计开发一个这样的图片批量下载器. 一.关于网络抓取与爬虫 网络蜘蛛的主要作用是从Internet上不停地下载网络资源.它的基本实现思想就是通过一个或多个入口网址来获取更多的URL,然后通过对这些URL所指向的网络资

自己动手写工具:自动点击小插件

一. 模拟点击操作应用场景 当我们需要对一个网页上的某个按钮进行多次点击以求得某种“好处”的时候,例如天猫的抢红包活动,我们可能需要点击N次之后才有可能获得一个红包,但是这个N是一个未知数,有可能我们要不停地点击半个小时甚至一个小时都还无法获得,自己估计也会点鼠标点得醉了.因此,针对这种情况,我们希望自己写一个小工具来让计算机帮我们做这件事. 既然是让计算机模拟我们的点击操作,其思路自然是找到指定的按钮或图片,循环对其执行click事件.于是,我们开始对其做一个最简单的实现来看看其基本思路.首先

【原创】自己动手写控件----XSmartNote控件

一.前面的话 在上一篇博文自己动手写工具----XSmartNote [Beta 3.0]中,用到了若干个自定义控件,其中包含用于显示Note内容的简单的Label扩展控件,用于展示标签内容的label扩展控件,还有包含自定义事件的含checkbox的控件.自定义控件的好处就是其灵活程度很高,不但可以扩展控件的外观,还可以扩展控件的事件,甚至从底层拦截Windows消息进行处理,这也是我喜欢自己写控件的原因.至于自定义控件的几种形式在这里就不说了,有兴趣的小伙伴可以百度一下,下面来看看这些控件的

【原创】连“霍金”都想学习的“人工智能”---【自己动手写神经网络】小白入门连载开始了(1)

欢迎关注[自己动手写神经网络]的博客连载!!! 第1章 神经网络简介 神经网络这个词,相信大家都不陌生.就在你打开本书,并试图了解神经网络时,你已经在使用一个世界上最复杂的神经网络——你的大脑,一个由大约1000亿个神经元(每个单元拥有约1万个连接)构成的复杂系统.但人的大脑太过复杂,以至于科学家们到目前为止仍然无法准确解释大脑的工作原理和方式.但有幸的是,生物神经网络的最最基本的元素已经能够被识别,而这就构成了本书想为你介绍的人工神经网络(Artificial Neural Network).

动手写一个Remoting测试工具

基于.NET开发分布式系统,经常用到Remoting技术.在测试驱动开发流行的今天,如果针对分布式系统中的每个Remoting接口的每个方法都要写详细的测试脚本,无疑非常浪费时间.所以,我想写一个能自动测试remoting接口的小工具InterfaceTester.而且,当分布式系统中的某个remoting接口出现bug时,该小工具可以提交需要模拟的数据,以便在调试remoting服务的环境中,快速定位和解决bug. InterfaceTester运行起来后的效果如下图: 1.如何使用 (1)首

自己动手写GC

有时候事情多得我喘不过气来的时候,我会出现一种异常反应,好像找点别的事做,就能摆脱烦恼了.通常的话我会自己写一些独立的小程序. 有一天早上,我正在写的书,工作中的事情,还有要为Strang Loop准备的分享,这些东西让我感到快崩溃了,突然间我想到,“我要写一个垃圾回收程序”. 是的,我知道这听起来有点疯狂.不过你可以把我这个荒唐的想法当成是一份编程语言基础的免费教程.通过百来行普通的C代码,我实现了一个标记删除的收集器,你懂的,它的确能回收内存. 在程序开发领域,垃圾回收就像一片鲨鱼出没的水域