寫代碼寫久了就會遇見不少好的代碼片段,以前是把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 歡迎討論