写代码写久了就会遇见不少好的代码片段,以前是把cs文件拷贝出来或者存在txt文档里面,然后造成管理困难查找困难的问题造成诸多的不方便。自己闲着没事就捯饬了一个我的“代码仓库”,用来管理和收藏我感觉不错的代码片段。用了一段时间感觉还不错,就在这里给大家分享下。混园子挺久,一直做伸手党,是时候拿点东西出来向大家混个脸熟~~
先上个界面:
程序中的左边是listbox 右边是webbrowser控件。具有基本的增删改查的功能,同时具有对博客园和CSDN文章的检索和抓取的功能,方便收藏代码。本地代码收藏是基于sqlite数据库,实际效果证明对大文本的载入效果还是很不错的!程序自定义了分类和编辑框,对于编辑框,我觉得是这个程序最拿得出手的一个亮点,待会儿详说.....
继续上图:
我们选择一个文章:
我们点下收藏:
收藏的时候就弹出了这个新建条目的编辑框,这个编辑框我弄了好久才整出来的 原理是用webbrowser控件加载kindeditor编辑器 原理是用C#调用webbrowser中的js方法把文档数据塞进去。保存的时候也是这样子取出html文档保存到本地的sqlite数据库中。所以程序中的展示和编辑都是基于webbrowser控件的,抓取的文章可能会调用外部的css或者js啥的。有可能在本地展示的时候就达不到web上展示的效果,所以有时候需要必要的修改后保存。
在编辑窗口选个分类 填一些备注信息 保存后就可以在本地库中检索到了
如图所示:本段博文已经被我收入囊中了
增删改啥的就布截图了 ,基本上都是差不多的操作。下面讲解下关键部分的代码。
目录结构
js文件夹里面放了jquery文件和博客园的common.js文件,是为了复原展示效果。。。
web文件夹里面是放了编辑器和展示与编辑的html文件
show.html 里面是空的,为了让后台向里面填塞展示的数据。
<!doctype html> <html> <head> </head> <body> <form> </form> </body> </html>
填数据的代码是:
private void LoadContent(string id) { dr_Content = SqlLiteHelper.GetDataRow(out error, "select a.id,title,content,Inserttime,updateTime,b.typeName as type,Remark from content a left join type b on a.type=b.id where a.id=" + id); string content = @"<center><H2>" + dr_Content["Title"].ToString() + "</H2></center> <small><font face=\"Arial, Helvetica\">分类:" + dr_Content["Type"].ToString() + "    录入时间:" + dr_Content["InsertTime"].ToString().Replace("''", "'") + "    编辑时间:" + dr_Content["UpdateTime"].ToString() + "<hr />" + dr_Content["Content"].ToString(); content += "<br/><br/><br/><br/><hr/> 备注:<br/>" + dr_Content["Remark"].ToString() + "</font><small>"; wb_Show.Document.Body.InnerHtml= content; }
关键代码是:
wb_Show.Document.Body.InnerHtml= content;
将组织好的html文档填塞到webbrowser控件里面的body里面。
edit.html代码为:
<!doctype html> <html> <head> <meta charset="utf-8" /> <title>D</title> <script charset="utf-8" src="kindeditor-min.js"></script> <script charset="utf-8" src="zh_CN.js"></script> <script> var editor; KindEditor.ready(function(K) { editor = K.create('textarea[name="content"]', { allowFileManager : true, fullscreenMode:true }); }); function getHtml() { return editor.html(); }; function setHtml(htmlCode) { editor.html(htmlCode); }; function ClearHtml() { editor.html(''); }; </script> </head> <body> <form> <textarea name="content" id="content_id" style="visibility:hidden;"> </textarea> </form> </body> </html>
在这个页面加载了kindeditor编辑器。还定义了三个方法分别是获取文档,填塞文档,清空文档。都是基于kindeditor编辑器的内置函数。
调用webbrowser控件里面的js方法setHtml的代码是
wb_edit.Document.InvokeScript("setHtml", new object[] { content });
方法名称和参数数组俩个参数。
读取就更简单:
string content = wb_edit.Document.InvokeScript("getHtml").ToString().Replace("'", "''");
使用webbrowser控件有个常见的问题就是js脚本错误弹出框 所以需要加代码屏蔽掉:
this.wb_Show.ScriptErrorsSuppressed = true;
另外一个问题是点击连接会出现调用系统的IE浏览器打开窗体的情况。可以这样子解决:
private void wb_ShowNet_NewWindow(object sender, CancelEventArgs e) { e.Cancel = true; string a_html = wb_ShowNet.Document.ActiveElement.OuterHtml; if (a_html.IndexOf("href") > -1) { string url = new Regex("href=\"[\\d\\D]+?\"").Match(a_html).Value.Replace("href=\"", "").Replace("\"",""); this.wb_ShowNet.Navigate(url); } }
在NewWindow事件里面监测打开的连接,把原事件取消掉 用正则重新编辑下连接的代码,取得网页链接后再返回给控件打开。
源代码下载地址:
http://www.everbox.com/f/cXhSfUh8npETWbIymF6O2aGRAl
bug啥的肯定有的,欢迎提出意见或者修改代码进行完善。方便的话把修改后的发我一份yesicoo@163.com 不甚感激
附个群号:160046333 欢迎讨论