C# .Net 2.0實例學習:WebBrowser頁面與WinForm交互技巧 2javascript
Study Case 4:高亮顯示 上一個例子中咱們學會了查找文本——究跟到底,對Web頁面仍是隻讀不寫。那麼,若是說要把全部的搜索結果高亮顯示呢?咱們很快會想到把全部匹配的文字顏色、背景改一下就能夠了。首先想到的多是直接修改HTML文本吧……可是,與SourceCode的高亮顯示不一樣,咱們須要而且只須要高亮頁面中的文本部分。HTML標籤、腳本代碼等等是絕對不該該去改動的。所以咱們不能把整個頁面的Source Code讀進來而後replace,那樣有破壞HTML文件結構的可能;咱們只能在可以分離出文本與其餘內容(標籤,腳本……)的前提下進行。 具體方法有不少,下面提供兩個比較簡單的方法。 方法一:使用TextRange(IHTMLTxtRange) 有了上一個Case的基礎,相信你們馬上會想到使用TextRange。沒錯,TextRange除了提供查找方法以外,還提供了一個pasteHTML方法,以指定的HTML文本替換當前TextRange中的內容。代碼片段以下: public partial class HilightDemo : Form { // 定義高亮顯示效果的標籤。 string tagBefore = "<span style='background-color:yellow;color:black'>"; string tagAfter = "</span>"; // …… private void btnHilight_Click(object sender, EventArgs e) { HtmlDocument htmlDoc = webBrowser.Document; string keyword = txtKeyword.Text.Trim(); if (keyword == "") return; object oTextRange = htmlDoc.Body.InvokeMember("createTextRange"); mshtml.IHTMLTxtRange txtrange = oTextRange as mshtml.IHTMLTxtRange; while (txtrange.findText(keyword, 1, 4)) { try { txtrange.pasteHTML(tagBefore + keyword + tagAfter); } catch { } txtrange.collapse(false); } } } ※這段代碼裏獲取IHTMLTxtRange的方式和上面的例子稍稍不一樣,其實所謂條條大路通羅馬,本質是同樣的。 方法二:使用DOM(文檔對象模型) 將HTML文檔解析爲DOM,而後遍歷每一個節點,在其中搜索關鍵字並進行相應替換處理便可。 public partial class HilightDemo : Form { //…… private void btnHilight_Click(object sender, EventArgs e) { HTMLDocument document = (HTMLDocument)webBrowser.Document.DomDocument; IHTMLDOMNode bodyNode = (IHTMLDOMNode)webBrowser.Document.Body.DomElement; string keyword = txtKeyword.Text.Trim(); if (keyword == "") return; HilightText(document, bodyNode, keyword); } private void HilightText(HTMLDocument document, IHTMLDOMNode node, string keyword) { // nodeType = 3:text節點 if (node.nodeType == 3) { string nodeText = node.nodeValue.ToString(); // 若是找到了關鍵字 if (nodeText.Contains(keyword)) { IHTMLDOMNode parentNode = node.parentNode; // 將關鍵字做爲分隔符,將文本分離,並逐個添加到原text節點的父節點 string[] result = nodeText.Split(new string[] { keyword }, StringSplitOptions.None); for (int i = 0; i < result.Length - 1; i++) { if (result[i] != "") { IHTMLDOMNode txtNode = document.createTextNode(result[i]); parentNode.insertBefore(txtNode, node); } IHTMLDOMNode orgNode = document.createTextNode(keyword); IHTMLDOMNode hilightedNode = (IHTMLDOMNode)document.createElement("SPAN"); IHTMLStyle style = ((IHTMLElement)hilightedNode).style; style.color = "black"; style.backgroundColor = "yellow"; hilightedNode.appendChild(orgNode); parentNode.insertBefore(hilightedNode, node); } if (result[result.Length - 1] != "") { IHTMLDOMNode postNode = document.createTextNode(result[result.Length - 1]); parentNode.insertBefore(postNode, node); } parentNode.removeChild(node); } // End of nodeText.Contains(keyword) } else { // 若是不是text節點,則遞歸搜索其子節點 IHTMLDOMChildrenCollection childNodes = node.childNodes as IHTMLDOMChildrenCollection; foreach (IHTMLDOMNode n in childNodes) { HilightText(document, n, keyword); } } } } 上面的兩段代碼都是爲了清晰易懂而精簡得不能再簡的,有不少地方很不完善。好比,沒考慮到如何從高亮顯示狀態復原;也沒有大小寫匹配等等。固然,掌握了原理以後相信這些都不會太難。 這兩種方法各有優缺點: 使用TextRange較輕量迅速,並且有一個特長,就是能夠把跨標籤(Tag)的關鍵字挑出來。例如,有這麼一段HTML: <b>Hel</b>lo World! 先無論做者出於什麼目的讓Hel三個字母成爲粗體,總之顯示在頁面上的是一句「Hello World!」。在咱們但願高亮頁面中的「Hello」這個關鍵字時,若是用DOM分析的話,會得出含有「Hel」的<b>節點和文本節點「lo World!」兩個節點,所以沒法將其挑出來。而TextRange則能正確識別,將其設置爲高亮。所以也能夠說TextRange是隻和文本有關,和HTML語法結構無關的對象。 可是,TextRange也有其致命缺點,加亮容易,反向的話就很難。換句話說,去除高亮顯示的時候不能再用TextRange,而須要採用其餘方法。 而DOM方法則正好相反, 因爲DOM的樹狀結構特性,雖然不能(或者很難)跨越Tag搜索關鍵字,可是去除高亮顯示並不繁瑣。 Study Case 5:與腳本的互操做 在Case 1當中,咱們已經看到,Web頁面的HTML元素的事件,能夠由Windows Form端來響應,能夠在某種程度上看做是Web頁面調用WinForm;那麼反過來,WinForm除了能夠直接訪問Web頁面的HTML元素以外,可否調用Web頁面裏的各類Script呢? 首先是調用Web頁面的腳本中已經定義好的函數。假設HTML中有以下Javascript: function DoAdd(a, b) { return a + b; } 那麼,咱們要在WinForm調用它,只需以下代碼便可: object oSum = webBrowser.Document.InvokeScript("DoAdd", new object[] { 1, 2 }); int sum = Convert.ToInt32(oSum); 其次,若是咱們想執行一段Web頁面中本來沒有的腳本,該怎麼作呢?此次.Net的類沒有提供,看來還要依靠COM了。IHTMLWindow2能夠將任意的字符串做爲腳本代碼來執行。 string scriptline01 = @"function ShowPageInfo() {"; string scriptline02 = @" var numLinks = document.links.length; "; string scriptline03 = @" var numForms = document.forms.length; "; string scriptline04 = @" var numImages = document.images.length; "; string scriptline05 = @" var numScripts = document.scripts.length; "; string scriptline06 = @" alert('網頁的統計結果:\r\n連接數:' + numLinks + "; string scriptline07 = @" '\r\n表單數:' + numForms + "; string scriptline08 = @" '\r\n圖像數:' + numImages + "; string scriptline09 = @" '\r\n腳本數:' + numScripts);}"; string scriptline10 = @"ShowPageInfo();"; string strScript = scriptline01 + scriptline02 + scriptline03 + scriptline04 + scriptline05 + scriptline06 + scriptline07 + scriptline08 + scriptline09 + scriptline10; IHTMLWindow2 win = (IHTMLWindow2)webBrowser.Document.Window.DomWindow; win.execScript(strScript, "Javascript"); OK,今天就寫到這裏吧,再想起什麼來再補充吧。歡迎你們多多指正,歡迎討論。
C# WebBrowser製做的HTML文本編輯器php
C# WebBrowser製做的HTML文本編輯器 · 下載源文件(http: //www.codeproject.com/cs/miscctrl/editor_in_windows_forms/editor2_src.zip) - 42.3 Kb · 下載演示項目(http: //www.codeproject.com/cs/miscctrl/editor_in_windows_forms/editor2_demo.zip) - 19.7 Kb · 原文:A Windows Forms based text editor with HTML output · 相似的控件:HTMLTextBox 簡介 剛纔,我在編寫一個聊天應用程序,其中一個聊天客戶端是基於 web 的並以 ASP.NET 2.0 編寫,另外一個聊天客戶端是 C# 編寫的基於 Windows 窗體的 .NET 應用。對於此Windows 窗體客戶端,我須要一個能夠輸出 HTML 的富文本編輯器(a rich text editor) ,以便於 ASP.NET 的客戶端能夠顯示 Windows 窗體客戶端的聊天內容。這樣,就排除了使用 RTF 文本框的可能。 我設計出的解決方案是在 Windows 窗體客戶端,以編輯模式使用一個 WebBrowser 控件。對於 WebBrowser 控件中選定的文本,同時在 WebBrowser 控件的上方放置包含格式按鈕的工具欄,以便設置文本格式。 本文說明了這個方案中,使用 WebBrowser 控件創建一個編輯器時的主要難點問題。由於源代碼不難理解,我就不深刻介紹了。 可是,我會介紹一些必要的實現技巧。 WebBrowser 控件設計模式設置 當使用此組件時,會自動應用設計模式,併爲文檔創建一個編輯模板。可是,做爲參考,下面簡單說明這是如何實現的。 應用設計模式須要使用 COM 接口,添加一個 MSHTML 的 "Microsoft HTML Object Library" 的引用,並添加一個對 'MSHTML' 的 'using'。 在把改變寫入到 DOM 文檔以前,有必要添加一個 body 到控件。要這樣作,你能夠簡單地設置一些文本到 WebBrowser 控件的 DocumentText 屬性中。 webBrowser1.DocumentText = "<html><body></body></html>" 下面的代碼能夠取得新的 DomDocument COM 接口的引用,並設置設計模式爲 "On"。 IHTMLDocument2 doc = webBrowser1.Document.DomDocument as IHTMLDocument2; doc.designMode = "On"; 最後,我把 WebBrowser 控件的上下文菜單替換掉,這樣 IE 瀏覽器的默認上下文菜單就不會顯示出來。 webBrowser1.Document.ContextMenuShowing += new HtmlElementEventHandler(Document_ContextMenuShowing); 瀏覽器如今處於設計模式中,使用一個自定義方法來顯示指定的上下文菜單。 格式化文本 使用 browser.Document 中的 ExecCommand 方法,你能夠把格式和編輯功能應用到設計模式下的瀏覽器控件。 下面是一些例子: public void Cut() { webBrowser1.Document.ExecCommand("Cut", false, null); } public void Paste() { webBrowser1.Document.ExecCommand("Paste", false, null); } public void Copy() { webBrowser1.Document.ExecCommand("Copy", false, null); } 某些命令用於綁定(顯示)當前選區的格式。 public void Bold() { webBrowser1.Document.ExecCommand("Bold", false, null); } public void Italic() { webBrowser1.Document.ExecCommand("Italic", false, null); } 同步刷新選定文本的格式按鈕 下面介紹一些比發出格式化命令到瀏覽器更有用的技巧。每 200 毫秒,我逐一查詢瀏覽器編輯選區的狀態,並據此設置工具欄格式按鈕的狀態。 private void timer_Tick(object sender, EventArgs e) { SetupKeyListener(); boldButton.Checked = IsBold(); italicButton.Checked = IsItalic(); underlineButton.Checked = IsUnderline(); orderedListButton.Checked = IsOrderedList(); unorderedListButton.Checked = IsUnorderedList(); linkButton.Enabled = SelectionType == SelectionType.Text; UpdateFontComboBox(); UpdateFontSizeComboBox(); if (Tick != null) Tick(); } 你可能已經注意到這兒使用了一個 Tick 計時器事件。外部的組件能夠訂閱此事件來更新 GUI 的狀態。舉例來講,它們將基於編輯器控件的狀態,刷新「剪切/複製/粘貼/撤銷/重複」(操做)的 Enabled 狀態。 我經過使用從 WebBrowser 控件返回的 COM 文檔接口,來完成此任務,先使用: IHTMLDocument2 doc = webBrowser1.Document.DomDocument as IHTMLDocument2; 而後,使用 queryCommandState 方法來肯定當前選區的狀態: public bool IsBold() { return doc.queryCommandState("Bold"); } public bool IsItalic() { return doc.queryCommandState("Italic"); } public bool IsUnderline() { return doc.queryCommandState("Underline"); } 鏈接按鈕和字體控件以一種簡單的方式管理,但我將會保留以代碼檢測的方法。 取得焦點 讓控件取得焦點不必定是簡單的。 WebBrowser 控件自己不接受焦點。 WebBrowser 控件的文檔也不接受焦點。可是,body 會取得焦點,能夠假定有一個 body 元素在控件中。 private void SuperFocus() { if (webBrowser1.Document != null && webBrowser1.Document.Body != null) webBrowser1.Document.Body.Focus(); } 固然,你決不須要直接調用此方法。在控件上調用 Focus 方法,會把焦點放置到包含了 WebBrowser 控件的編輯器控件上。當接收到 GotFocus 事件時,編輯器控件會自動把焦點轉到 WebBrowser 控件文檔的 body 上。 取得文本或 HTML 分別使用 BodyHtml 和 BodyText 方法,能夠返回 HTML 和文本。 鏈接到組件程序集 在 Visual Studio 2005 中,你能夠鏈接到一個程序集 (添加一個引用),即便程序集是可執行的(文件)。此編輯器是做爲內嵌在窗體的組件來編寫的,所以你能夠把這個組件添加到控件面板上,並把它拖放到你的應用程序中。此控件的名稱爲 Editor,在命名空間 Design 中。 結束語 .NET 2.0 中的 WebBrowser 控件能夠做爲一個有效的文本編輯器來使用。當你須要一個 HTML 編輯器控件時,它頗有用。可是在某些範圍內,不能徹底直接地使用 WebBrowser 控件來實現。本文試圖展現一些讓它工做的必要技巧。
C# goto語句css
goto語句直接跳轉到代碼行上,優勢是:這是控制何時執行哪些代碼的一種很是簡單的方式.缺點是:過多的使用這個技巧將很難讀懂代碼. 下面面介紹如何使用這個技巧. goto語句的用法以下: goto<labeIName>; 標籤用下述方式定義: <labelname>; 列如,下面的代碼: int myInteger=5; goto myLabel; myInteger+=10; myLabel; Console.WriteLine("myInteger={0}",myInteger); 其執行過程以下: ...myinteger聲明爲int類型,並賦予值5. ...goto語句中斷正常的執行過程,把控制轉到標爲mylabel:的代碼行上. ...myinteger的值寫到控制檯上. 第3行代碼並無執行. 實際上,若是在應用程序中加入這段代碼,就會發現編譯代碼時,任務列表會顯示一個警告,即"Unreachable code detected"和一個行號.
C# webBrowser js 交互 調用html
前面我也有轉載過相關文章,當時沒有測試,今天測試 ,結果不能用,之前都沒注意。 今天整理了一下 。代碼以下: using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; using System.Security.Permissions; namespace test10 { [PermissionSet(SecurityAction.Demand, Name = "FullTrust")] [System.Runtime.InteropServices.ComVisibleAttribute(true)] public partial class MainForm : Form { public MainForm() { InitializeComponent(); webBrowser1.ObjectForScripting = this; } void MainFormLoad(object sender, EventArgs e) { string s=""; s+="<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">"; s+="<HTML>"; s+=" <HEAD>"; s+=" <TITLE> New Document </TITLE>"; s+=" <META NAME=\"Generator\" CONTENT=\"EditPlus\">"; s+=" <META NAME=\"Author\" CONTENT=\"\">"; s+=" <META NAME=\"Keywords\" CONTENT=\"\">"; s+=" <META NAME=\"Description\" CONTENT=\"\">"; s+=" <script>"; s+=" function ShopXG(inf)"; s+=" {"; s+=" alert(inf);"; s+=" }"; s+=" var as = 'as';"; s+=" </script>"; s+=""; s+=""; s+=" </HEAD>"; s+=""; s+=" <BODY>"; s+=" <input type=\"button\" value=\"調用 js 方法\" onClick=\"ShopXG('123123123')\" />"; s+=" <input type=\"button\" value=\"調用 C# 方法\" onclick=\"window.external.te('我調用到了 C# 方法');\"/>";//調用 C# 的te 方法 s+=" <input id=\"btnId\" type=\"button\" value=\"C#添加事件\"/>"; s+=" </BODY>"; s+="</HTML>"; webBrowser1.DocumentText =s; } void Button1Click(object sender, EventArgs e) { HtmlElement el = webBrowser1.Document.GetElementById("btnId"); el.Click+= new HtmlElementEventHandler(BtnClick);//爲 web 按鈕添加事件 } void Button2Click(object sender, EventArgs e) { webBrowser1.Document.InvokeScript("ShopXG", new string[] {"我調用到了 js 方法"});//調用 web ShopXG方法 } void BtnClick(object sender, EventArgs e){ MessageBox.Show("C# 添加事件到 js"); } public void te(string s) { MessageBox.Show(s); } } }
C#經過webbrowser控件與javascript交互java
C#經過webbrowser控件與javascript交互 1.C#裏調用控件裏面網頁的js函數 // 調用JavaScript的messageBox方法,並傳入參數 object[] objects = new object[1]; objects[0] = 「C#訪問JavaScript腳本」; this.webBrowser1.Document.InvokeScript(「messageBox」, objects); //object就是傳入的參數,而messageBox則是網頁中預約義好的js函數。 經過這種方式C#裏面就能夠執行Javascript函數,能夠把上面的代碼放到一個button的click事件裏面。 2.C#windows窗體應用webbrowser控件裏網頁js調用C#窗體的函數 首先須要在代碼裏面加上 [System.Runtime.InteropServices.ComVisibleAttribute(true)] public partial class Form1 : Form { …..// } 這樣使得C#的com對象是對網頁裏的javascript可見的。 而後在嵌入網頁裏面經過「window.external.MyMessageBox(‘javascript訪問C#代碼’)」 ,即經過window.external捕獲調用c#定義好的函數。 具體Form.cs代碼以下(經過vs2008建立的c#window窗體應用,拖拽上一個webbrowser控件和button控件。): [System.Runtime.InteropServices.ComVisibleAttribute(true)] public partial class Form1 : Form { public Form1() { InitializeComponent(); System.IO.FileInfo file = new System.IO.FileInfo(「test.html」); // WebBrowser控件顯示的網頁路徑 this.webBrowser1.Url = new Uri(file.FullName); // 將當前類設置爲可由腳本訪問 this.webBrowser1.ObjectForScripting =this; } private void button1_Click(object sender, EventArgs e) { } // 提供給JavaScript調用的方法 public void MyMessageBox(string message) { MessageBox.Show(message); } private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { } private void button1_Click_1(object sender, EventArgs e) { // 調用JavaScript的messageBox方法,並傳入參數 object[] objects = new object[1]; objects[0] = 「C#訪問JavaScript腳本」; this.webBrowser1.Document.InvokeScript(「messageBox」, objects); } } test.html內容比較簡單: <html> <head> <meta http-equiv=」Content-Language」 content=」zh-cn」> <script language=」javascript」 type=」text/javascript」> <!– 提供給C#程序調用的方法 –> function messageBox(message) { alert(message); } </script> </head> <body> <!– 調用C#方法 –> <button onclick=」window.external.MyMessageBox(‘javascript訪問C#代碼’)」 > javascript訪問C#代碼</button> </body> </html> 配置運行成功的話,能夠看到相互調用的效果,但願對須要的童鞋有用! 補充一個js調用C#函數的方法: 1,設置腳本對象: wb.ObjectForScripting = this; // wb爲Webbrowser對象 2,公開方法 public void Alert() { MessageBox.Show("dkkfdkf"); } 3,而後頁面上用javascript能夠調用這個方法 external.Alert(); 看了高人的博客,再補充幾個,哈: Winform WebBrowser控件對訪問頁面執行、改寫、添加Javascript代碼 你們有興趣能夠加我QQ羣交流:14792063 廣州軟件開發團隊使用Winform WebBrowser控件對訪問頁面執行、改寫、添加Javascript代碼,能夠解決許多問題,實現你想要的效果。能夠經過引用Microsoft.mshtml,實現對Javascript的操做,代碼以下:代碼mshtml.IHTMLDocument2 doc = webBrowser1.Document.DomDocument as mshtml.IHTMLDocument2;mshtml.IHTMLWindow2 win = doc.parentWindow as mshtml.IHTMLWindow2;win.execScript(@"alert('hello webbrowser')", "javascript"); 其實還有一種更好的、無需引用Microsoft.mshtml的實現方式:代碼HtmlElement ele = webBrowser1.Document.CreateElement("script");ele.SetAttribute("type", "text/javascript");ele.SetAttribute("text", "alert('hello webbrowser')");webBrowser1.Document.Body.AppendChild(ele); 這種使用.Net框架自己所提供的對象,相比引用框架外的COM,好處是顯而易見的,這將更方便於安裝部署至客戶機上。 執行上述兩段代碼的效果是同樣的,都將彈出網頁對話框「hello webbrowser」。若是僅是執行Javascript方法,那麼,有更簡單的且可得到方法返回值的方式,首先假如頁面上有以下Javascript方法:function sayHello(to) { alert('hello ' + to); return 'hi, i am javascript';} 在Winform中執行如下代碼,首先會彈出網頁對話框「hello webbrowser」,而後是Winform的MessageBox對話框「hi, i am javascript」 MessageBox.Show(webBrowser1.Document.InvokeScript("sayHello",new object[]{"webbrowser"}).ToString());Winform WebBrowser控件是一個好東西,它不但能夠導航網頁,還可使用它獲取一些在客戶端瀏覽器HTML源代碼中沒法獲取的數據。如使用了AJAX獲取數據的頁面,經過客戶端瀏覽器查看源代碼的方式,將沒法獲取到這部分的數據;又如使用了Javascript對內容進行加密以防止採集的頁面,即便讓你得到HTML源代碼,也難以解密獲得你想要的結果。但WebBrowser使得這一切變得簡單!有興趣的朋友歡迎繼續閱讀本博的另外一篇文章《》,講述如何經過WebBrowser訪問加密頁面,改寫其中的Javascirpt方法獲取加密的結果。
C#中經常使用函數列表node
1、DateTime 數字型 System.DateTime currentTime=new System.DateTime(); 1.1 取當前年月日時分秒 currentTime=System.DateTime.Now; 1.2 取當前年 int 年=currentTime.Year; 1.3 取當前月 int 月=currentTime.Month; 1.4 取當前日 int 日=currentTime.Day; 1.5 取當前時 int 時=currentTime.Hour; 1.6 取當前分 int 分=currentTime.Minute; 1.7 取當前秒 int 秒=currentTime.Second; 1.8 取當前毫秒 int 毫秒=currentTime.Millisecond; (變量可用中文) 1.9 取中文日期顯示——年月日時分 string strY=currentTime.ToString("f"); //不顯示秒 string strYM=currentTime.ToString("y"); 1.11 取中文日期顯示_月日 string strMD=currentTime.ToString("m"); 1.12 取當前年月日,格式爲:2003-9-23 string strYMD=currentTime.ToString("d"); 1.13 取當前時分,格式爲:14:24 string strT=currentTime.ToString("t"); 2、Int32.Parse(變量) Int32.Parse("常量") 字符型轉換 轉爲32位數字型 3、 變量.ToString() 字符型轉換 轉爲字符串 12345.ToString("n"); //生成 12,345.00 12345.ToString("C"); //生成 ¥12,345.00 12345.ToString("e"); //生成 1.234500e+004 12345.ToString("f4"); //生成 12345.0000 12345.ToString("x"); //生成 3039 (16進制) 12345.ToString("p"); //生成 1,234,500.00% 4、變量.Length 數字型 取字串長度: 如: string str="中國"; int Len = str.Length ; //Len是自定義變量, str是求測的字串的變量名 5、System.Text.Encoding.Default.GetBytes(變量) 字碼轉換 轉爲比特碼 如:byte[] bytStr = System.Text.Encoding.Default.GetBytes(str); 而後可獲得比特長度: len = bytStr.Length; 6、System.Text.StringBuilder("") 字符串相加,(+號是否是也同樣?) 如:System.Text.StringBuilder sb = new System.Text.StringBuilder(""); sb.Append("中華"); sb.Append("人民"); sb.Append("共和國"); 7、變量.Substring(參數1,參數2); 截取字串的一部分,參數1爲左起始位數,參數2爲截取幾位。 如:string s1 = str.Substring(0,2); 8、String user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString(); 取遠程用戶IP地址 9.1、穿過代理服務器取遠程用戶真實IP地址: if(Request.ServerVariables["HTTP_VIA"]!=null){ string user_IP=Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString(); }else{ string user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString(); } 9.2得到本機IP public static string UserTrueIP() { string userIP = ""; if ((HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null) && (HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != "")) { userIP = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; } if (userIP == "") { userIP = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; } return userIP; } 10、 Session["變量"]; 存取Session值; 如,賦值: Session["username"]="小布什"; 取值: Object objName=Session["username"]; String strName=objName.ToString(); 清空: Session.RemoveAll(); 11、String str=Request.QueryString["變量"]; 用超連接傳送變量。 如在任一頁中建超連接:<a href=Edit.aspx?fbid=23>點擊</a> 在Edit.aspx頁中取值:String str=Request.QueryString["fdid"]; 12、DOC對象.CreateElement("新建節點名"); 建立XML文檔新節點 13、父節點.AppendChild(子節點); 將新建的子節點加到XML文檔父節點下 14、 父節點.RemoveChild(節點); 刪除節點 15、Response Response.Write("字串"); Response.Write(變量); 向頁面輸出。 Response.Redirect("URL地址"); 跳轉到URL指定的頁面 16、char.IsWhiteSpce(字串變量,位數)——邏輯型 查指定位置是否空字符; 如: string str="中國 人民"; Response.Write(char.IsWhiteSpace(str,2)); //結果爲:True, 第一個字符是0位,2是第三個字符。 17、char.IsPunctuation(''字符'') --邏輯型 查字符是不是標點符號 如:Response.Write(char.IsPunctuation(''A'')); //返回:False 18、(int)''字符'' 把字符轉爲數字,查代碼點,注意是單引號。 如: Response.Write((int)''中''); //結果爲中字的代碼:20013 19、(char)代碼 把數字轉爲字符,查代碼表明的字符。 如: Response.Write((char)22269); //返回「國」字。 20、 Trim() 清除字串先後空格 21 、字串變量.Replace("子字串","替換爲") 字串替換 如: string str="中國"; str=str.Replace("國","央"); //將國字換爲央字 Response.Write(str); //輸出結果爲「中央」 再如:(這個很是實用) string str="這是<script>腳本"; str=str.Replace("<","<font><</font>"); //將左尖括號替換爲<font> 與 < 與 </font> (或換爲<,但估計經XML存諸後,再提出仍會還原) Response.Write(str); //顯示爲:「這是<script>腳本」 若是不替換,<script>將不顯示,若是是一段腳本,將運行;而替換後,腳本將不運行。 這段代碼的價值在於:你可讓一個文本中的全部HTML標籤失效,所有顯示出來,保護你的具備交互性的站點。 具體實現:將你的表單提交按鈕腳本加上下面代碼: string strSubmit=label1.Text; //label1是你讓用戶提交數據的控件ID。 strSubmit=strSubmit.Replace("<","<font><</font>"); 而後保存或輸出strSubmit。 用此方法還能夠簡單實現UBB代碼。 22、Math.Max(i,j) 取i與j中的最大值 如 int x=Math.Max(5,10); // x將取值 10 23、字串對比通常都用: if(str1==str2){ } , 但還有別的方法: (1)、 string str1; str2 //語法: str1.EndsWith(str2); __檢測字串str1是否以字串str2結尾,返回布爾值.如: if(str1.EndsWith(str2)){ Response.Write("字串str1是以"+str2+"結束的"); } (2)、 //語法:str1.Equals(str2); __檢測字串str1是否與字串str2相等,返回布爾值,用法同上. (3)、 //語法 Equals(str1,str2); __檢測字串str1是否與字串str2相等,返回布爾值,用法同上. 24、IndexOf() 、LastIndexOf() 查找字串中指定字符或字串首次(最後一次)出現的位置,返回索引值,如: str1.IndexOf("字"); //查找「字」在str1中的索引值(位置) str1.IndexOf("字串");//查找「字串」的第一個字符在str1中的索引值(位置) str1.IndexOf("字串",3,2);//從str1第4個字符起,查找2個字符,查找「字串」的第一個字符在str1中的索引值(位置) 25、Insert() 在字串中指定索引位插入指定字符。如: str1.Insert(1,"字");在str1的第二個字符處插入「字」,若是str1="中國",插入後爲「中字國」; 26、PadLeft()、PadRight() 在字串左(或右)加空格或指定char字符,使字串達到指定長度,如: <% string str1="中國人"; str1=str1.PadLeft(10,''1''); //無第二參數爲加空格 Response.Write(str1); //結果爲「1111111中國人」 , 字串長爲10 %> 27、Remove() 從指定位置開始刪除指定數的字符 28.Server.UrlEncode(string str) 將str轉換成編碼 29.Server.UrlDecode(string str) 對編碼進行解碼
Web Browser Express 概述程序員
Web Browser Express 概述 Visual Studio 2005 8(共 8)對本文的評價是有幫助 - 評價此主題 發佈日期 : 8/26/2004 | 更新日期 : 8/26/2004 John Kennedy Microsoft Corporation 摘要:創建您本身的、支持選項卡的 Web 瀏覽器,以及鏈接到搜索引擎的集成連接。 下載 WebBrowserExpress.msi 示例文件。 本頁內容 簡介 利用他人成果的好處 設計 Web 瀏覽器 工做原理 有意思的幾點 擴展建議 小結 簡介 Web 瀏覽器的一個功能是在同一瀏覽器窗口內打開不一樣選項卡或子頁,這個功能正在變得更加普及。當瀏覽多個站點時,使用選項卡來分開多個頁會保持桌面的整齊。有若干種第三方 Web 瀏覽器在 Windows 和其餘平臺上提供這一功能,若是您跟我同樣,您將發現這是一種讓人上癮的瀏覽方法。不少瀏覽器,不管是默認設置仍是經過插件,也提供一種快速方法,無須直接使用搜索引擎就能夠執行 Web 搜索。可以編寫本身的瀏覽器,並使其可以完成全部這些工做,還能把它微調並調整到徹底適合您的須要,那不是很棒嗎? 圖 1:用 Visual C# Express 設計並實現本身的 Web 瀏覽器 將這些對功能的渴望變爲一種全新的產品看起來好像須要大量的工做。畢竟,開發 Internet Explorer 用了多少時間?(答:很長時間。)我如何可以只用一夜的時間,單槍匹馬,就能複製出 Internet Explorer 的強大 HTML 呈現功能並添加我本身的新功能列表?那是由於我使用 Visual C# Express。 返回頁首 利用他人成果的好處 在一個晚上編寫 Web 瀏覽器的祕密在於使用其餘人的成果。在本例中,祕密是使用了 C# Express WebBrowser 控件。若是您安裝了 C# Express 而且打開了幫助,您可能已經看到了一個叫作¡°如何:用 C# Express建立 Windows 應用程序¡±的主題。這一簡短的項目將指導您完成建立 Windows 窗體應用程序所涉及的各個步驟。若是您尚未看完,並且您對 C# 不熟悉,我建議您閱讀它。 關鍵之處是,經過使用與 C# Express 配套的控件,建立多個應用程序(包括完整的 Web 瀏覽器)都是很容易的。一旦 WebBrowser 控件確實已在 Windows 窗體上了,您只需告訴它哪些 URL 是要獲取並顯示的,以及是否須要返回、向前、刷新或中止。鏈接到 Internet、獲取數據、格式化 HTML、顯示圖形等全部困難的工做都由該控件處理。 這個項目與幫助項目相近,除了一點,該項目建立多個 WebBrowser 控件並將其添加到 TabControl 中的網頁上,而不是隻添加一個WebBrowser 控件到 Windows 窗體上。是的,我甚至無須編寫代碼來建立 TabControl。這是從工具箱到 Windows 窗體拖放的另外一個示例。 那麼,雖然我知道這看似一個巨大而複雜的應用程序,彷彿須要數月的工做來完成,但事實上我只是連結了現有控件間的點,就在一個晚上完成了全部工做。這就是個人編程方式! 返回頁首 設計 Web 瀏覽器 圖 2:從工具箱拖動控件是編寫這一應用程序的關鍵 如下描述了我如何着手建立 Web Browser Express 項目。在從 C# Express 新項目對話框建立一個Windows 應用程序以後,我將下列控件拖到 Windows 窗體: TabControl:這個控件存儲全部子頁,每一個子頁能控制一個 WebBrowser 控件。一旦它已經建立,向其添加其餘頁就會很容易。爲了肯定它填充了整個 Windows 窗體,Dock 屬性被設定爲 Fill。這使得該控件保持與 Windows 窗體一樣大小,即使是調整大小以後。 MenuStrip:儘管這個應用程序中沒有菜單,仍是存在 MenuStrip 來提供一個屏幕頂端的區域,按鈕和文本框能夠添加到這個區域。另外,若是您決定添加一些菜單選項,您能夠在這裏添加。我將 MenuStrip 拖出以使其變得稍大。 Buttons:須要有一些用於 Web 瀏覽的簡單控件。按鈕被拖動到 MenuStrip 中,並調整大小,有一個圖像應用於這些按鈕。我唯一須要作的一件事就是從新繪製圖像背景,使其爲淺藍色,以便看起來像 MenuStrip。 Textboxes 和 ComboBoxes :除了按鈕,我還須要一個用於 URL 和搜索字符串的文本框。實際上,URL 是一個 ComboBoxes,容許用戶輸入一個 Web 地址,並從一個下拉列表中選擇項目。這個列表是在設計器中填充的,但若是您但願的話能夠以編程方式添加新項。 PictureBox:最右邊的 PictureBox 控件是爲了裝飾用的。Web 瀏覽器在下載內容時會顯示一些動畫。 timer:timer 對象用於一秒鐘數次發出一個消息。這個消息被一個叫作 timer1_tick() 的方法捕獲,並用於更改在 PictureBox 中顯示的圖像。結果是動畫。這並不算是第一流的解決方案,可是它奏效。 返回頁首 工做原理 當該程序啓動後,它所作的第一件事是調用 Create_a_new_tab()。此方法建立一個新選項卡頁,將其添加到 TabControl,而後在其上建立一個 WebBrowser 控件。WebBrowser URL 被設定爲「主頁」,不管它在您的系統上多是什麼。下面是建立新選項卡的代碼: // Create a new Tab Page TabPage newpage = new TabPage("Loading..."); tabControl1.TabPages.Add(newpage); 這是建立新 WebBrowser 控件的代碼: // Create a new WebBrowser control. WebBrowser webpage = new WebBrowser(); webpage.Parent = newpage; webpage.Dock = DockStyle.Fill; webpage.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webpage_DocumentCompleted); webpage.GoHome(); 此代碼肯定 WebBrowser 的父級是 Tab 頁。它還用設置爲 Fill 的 Dock 來肯定它也保持在窗口的實際大小。咱們還添加了一個事件處理程序:控件經過將消息發送到您的程序來工做。您能夠選擇您所聆聽的消息,以及經過將事件處理程序連接到消息所調用的方法。在本例中,該消息告訴咱們 WebControl 已經完成了站點的加載和顯示,當完成任務時,它將調用名爲 webpage_DocumentComplete() 的方法。這容許咱們定義當網頁加載完畢時執行的代碼。例如,中止動畫。 Create_a_new_tab() 方法中的最後一行啓用計時器: timer1.Enabled = true; 計時器輕鬆地將小段消息發送到 timer1_tick(),它改變在 PictureBox 控件中顯示的圖像,以下所示: private void timer1_Tick(object sender, EventArgs e) { // This method is called by the timer, and we use it to update the // image displayed by the PictureBox control to create a simple // animation. image_animation++; if (image_animation > 10) image_animation = 0; switch (image_animation) { case 0: pictureBox_busy.Image = wbe.Properties.Resources.anim0; break; case 1: pictureBox_busy.Image = wbe.Properties.Resources.anim1; break; case 2: pictureBox_busy.Image = wbe.Properties.Resources.anim2; break; ... case 7: pictureBox_busy.Image = wbe.Properties.Resources.anim7; break; case 8: pictureBox_busy.Image = wbe.Properties.Resources.anim8; break; case 9: pictureBox_busy.Image = wbe.Properties.Resources.anim9; break; } } 您能夠看到,計時器每次激發時,在 PictureBox 中就會顯示一個不一樣的圖像。使用您將一個圖像分配到按鈕或 PictureBox 控件時顯示的對話框,從磁盤加載圖像。 程序的其他部分由事件驅動 — 當用戶單擊按鈕或者輸入一個 Web 地址或搜索字符串時調用特定方法。 例如,Web 導航按鈕都調用當前 WebBrowser 控件。例如,若是您單擊 Back 按鈕,會調用如下方法: private void button_back_Click(object sender, EventArgs e) { // Go Back - if the web control can go back, do it. WebBrowser thiswebpage = GetCurrentWebBrowser(); if (thiswebpage.CanGoBack) thiswebpage.GoBack(); } 當在 Address 組合框中輸入一個 URL 時,咱們使用 Web 控件的 navigate 方法來獲取並顯示該頁。下面的代碼使用了當前顯示在組合框中的文本並將其傳遞到 navigate 方法: WebBrowser thiswebpage = GetCurrentWebBrowser(); thiswebpage.Navigate(comboBoxurl.Text); timer1.Enabled = true; 返回頁首 有意思的幾點 在編寫這個項目時,我想到了幾個小竅門。不過,可能它們實際上並不能說是竅門,而是一些技術,當您編寫本身的代碼時可能發現它們是有用的。 使文本和組合框響應 Return 鍵。 Address ComboBoxes 和 Search TextBox 容許用戶輸入文本,而後在單擊 Go 按鈕時使用這個文本。使用 Text 屬性從控件提取文本是很容易的。不過,若是按鍵盤上的「return」鍵就能夠執行與單擊一個按鈕一樣的操做,這樣也很好。我經過從兩個文本框檢查 KeyUp 消息來使其奏效。當 KeyUp 消息到達時,我檢查它是不是 Return 鍵。若是它是,就觸發了與單擊按鈕相同的操做。 ComboBox 而非TextBox Web Browser Express 的第一個版本將一個 TextBox用於地址 URL 和 Search 框。這很奏效,可是在實踐中每次都要手工輸入 URL 十分麻煩。我刪除了 ComboBox 並添加了一個 TextBox,用一些 URL 填充這一組合框來使用戶開始。您能夠從 ComboBox 屬性資源管理器添加您本身的 URL。 集成搜索 全部流行的 Web 瀏覽器都有一個能夠輸入搜索詞彙的文本框,結果會返回到 Web 頁中,而不須要首先瀏覽到搜索引擎。因爲 MSN 搜索目前有了更新,這看起來是將此功能內置到我本身的 Web 瀏覽器中的最佳理由。 這很是簡單。只需查看 Internet Explorer 中 MSN 搜索上的歷史記錄,看一下搜索字符串須要使用的格式。而後 Search 方法將搜索文本追加到 URL 並定位到該連接,結果做爲一個標準 Web 頁返回。 動畫 從圖形化 Web 瀏覽器的早期以來,從 Web 請求內容就是有跡可尋的,這樣用戶就不會覺得它們的計算機出了問題,或者覺得全部東西都被鎖定了。總的來講,讓用戶知道有些事在發生而且他們須要有耐心老是個好主意。 這是要實現的項目中我最喜歡的部分之一,若是您在藝術上有幾分天賦,那麼在建立可以想象到的最酷的徽標時,您能夠獲得很多樂趣。在本例中,我在一個動畫程序中建立了一系列大約 12 個幀,並將其做爲 BMP 圖像導出,加載到 C# Express 中。 圖 3:添加圖形十分簡單。爲一個按鈕或 PictureBox 選擇圖像屬性,您能夠直接從磁盤導入圖像。在開始前肯定圖像的大小正確。 返回頁首 擴展建議 若是您已經嘗試過了 Web Browser Express,而且但願添加本身的功能,那麼我這篇文章就作得不錯。爲了讓您保持忙碌,下面還有幾個主意,讓您能夠相對較快地取得進步。 歷史記錄:保留全部曾訪問過的 Web 站點的記錄,這樣再訪問它們時會比較容易。 自動完成:檢查 Return 鍵的方法也可以檢查之前輸入過的 URL,並自動將其完成。與 Internet Explorer 相比,您能夠更改這一自動完成的方式,好比能夠只有在按 Tab 鍵時才自動完成。 收藏:ComboBox 由 6 個 Web 站點填充,您能夠從 Properties 資源管理器很容易地更改這些站點。然而,將一個新按鈕添加到MenuStrip 取得當前正在顯示的 Web 站點並將其添加到 ComboBox 列表怎麼樣呢?用這種方法用戶能夠構建起其收藏站點的列表。當程序退出並從新啓動時,您須要一些方法來保存並從新加載這個列表。 集成的 RSS 閱讀器:保持比競爭對手領先一步,儘可能將 RSS 閱讀器內置到您的 Web 瀏覽器中。 返回頁首 小結 用 C# Express 建立應用程序的祕密在於:知道哪些控件是可用的,以及用這些控件能夠作什麼。在本例中,只用了幾個控件就構造了一個全功能的 Web 瀏覽器。祝您本身編程時好運。 John Kennedy 是 C# 用戶教育團隊的程序員/做者。您能夠經過閱讀他的網絡日記,在聯機幫助編寫中瞭解他的成就,網絡日記網址爲:http://blogs.msdn.com/johnkenn 轉到原英文頁面 返回頁首
webbrowser頁面放大web
his.webBrowser1.Document.Body.Style = "zoom:0.8"; document.body.style.zoom=this.options[this.selectedIndex].text
蛙蛙推薦:WebBrowser控件的高級用法,c#和Javascript交互及光標位置恢復數據庫
蛙蛙推薦:WebBrowser控件的高級用法,c#和Javascript交互及光標位置恢復 摘要:在作Winform應用的時候,有些效果不太好作,不像網頁,用CSS和HTML能作出灰常漂亮的界面來,其實用WebBrowser可讓你的程序擁有二者的優點。這裏介紹一個winform內嵌WebBrowser作的一個RSS瀏覽器及內嵌在Winform裏的html編輯器的光標恢復問題。 不知道你們有沒有用過FeedDemon,它是一個不錯的RSS訂閱工具,左邊的導航樹是Winform的,右邊的主區域是用WebBrowser來呈現的,並且在主區域點擊某條RSS條目後左邊的樹節點相應的未讀數目就會變化,點擊左邊的樹選擇「設置全部項目未已讀」,右邊主區域的RSS列表就會變爲已讀圖標,這是一個典型的Winform和WebBrowser相結合的例子,既發揮了Winform能利用本地CPU計算能力,響應快的特色,又發揮了HTML編程容易,界面華麗的優點,要用winform寫一個右邊主區域效果的控件,估計得費很多力。 咱們先來看下這個RSS閱讀器的核心功能,首先是利用http請求去獲取rss內容,RSS是XML格式的,顯示的話,就能夠用XSLT來顯示,這樣能夠作到內容和顯示相分離,顯示部分用WebBrowser來顯示,而後呢WebBrowser裏的javascript要能夠調用Winform方法,Winform也要能調用Webbrowser控件裏的javascript方法。 RSS的XML格式你們都很熟悉了,隨便找一段示例以下 <?xml version="1.0" encoding="utf-8"?> <rss version="2.0" xmlns:slash="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <channel> <title>老農專一數據庫編程</title> <link>http://www.5do8.com/</link> <description>老農如是想如是爲</description> <copyright>copyright by 5do8</copyright> <item read="true"> <title>我軍步兵營所屬炮連的98式120火箭筒 ..</title> <description>我軍步兵營所屬炮連的98式120火箭筒 ..</description> <link>/tableforum/App/view.php?bbsid=4&subid=1&fid=65544&tbid=8075</link> <author></author> <pubDate> Wed, 30 Jan 2008 22:03:01 GMT </pubDate> </item> <item read="true"> <title>溫今早看望廣州火車站80萬滯留旅客:"大..</title> <description>溫今早看望廣州火車站80萬滯留旅客:"大..</description> <link>/tableforum/App/view.php?bbsid=4&subid=2&fid=65638&tbid=2819</link> <author></author> <pubDate> Wed, 30 Jan 2008 22:03:01 GMT </pubDate> </item> <item read="true"> <title>溫今早看望廣州火車站80萬滯留旅客:"大..</title> <description>溫今早看望廣州火車站80萬滯留旅客:"大..</description> <link>/tableforum/App/view.php?bbsid=4&subid=3&fid=65639&tbid=6065</link> <author></author> <pubDate> Wed, 30 Jan 2008 22:03:01 GMT </pubDate> </item> <item> <title>07最惹火十部國產片</title> <description>07最惹火十部國產片</description> <link>http://sh.sohu.com/7/1103/22/column216152269.shtml</link> <author></author> <pubDate> Wed, 30 Jan 2008 22:02:55 GMT </pubDate> </item> <item> <title>賺大錢取之有道火爆</title> <description>賺大錢取之有道火爆</description> <link>http://doc.go.sohu.com/200712/df66a3feef3110edd839666dcb3fc1de.php?url=http://vip.78.cn/zs/gbook_admin/getgo.php?id=452</link> <author></author> <pubDate> Wed, 30 Jan 2008 22:02:55 GMT </pubDate> </item> <item> <title>火!等一分鐘</title> <description>火!等一分鐘</description> <link>http://61.135.132.134/goto.php?aid=27&pid=1153</link> <author></author> <pubDate> Wed, 30 Jan 2008 22:02:55 GMT </pubDate> </item> <item> <title>火車票預售期</title> <description>火車票預售期</description> <link>http://news.sogou.com/news?query=火車票預售??pid=01003102&p=01010302</link> <author></author> <pubDate> Wed, 30 Jan 2008 22:02:55 GMT </pubDate> </item> <item> <title>春運火車票</title> <description>春運火車票</description> <link>http://news.sogou.com/news?query=春運火車票&pid=01003102&p=01010302</link> <author></author> <pubDate> Wed, 30 Jan 2008 22:02:55 GMT </pubDate> </item> <item> <title>輕鬆購買火車票!</title> <description>輕鬆購買火車票!</description> <link>http://61.135.132.134/goto.php?aid=26&pid=1175</link> <author></author> <pubDate> Wed, 30 Jan 2008 22:02:55 GMT </pubDate> </item> <item> <title>one-mall·火熱招商</title> <description>one-mall·火熱招商</description> <link>http://shop.focus.cn/shopview/450228.html</link> <author></author> <pubDate> Wed, 30 Jan 2008 22:02:55 GMT </pubDate> </item> <item> <title>六佰本火熱招商進行中</title> <description>六佰本火熱招商進行中</description> <link>http://shop.focus.cn/shopview/450319.html</link> <author></author> <pubDate> Wed, 30 Jan 2008 22:02:55 GMT </pubDate> </item> </channel> </rss> 咱們還要再寫個RSS來呈現這個RSS,就以列表的方式呈現就好了,而後咱們設置簡單的CSS,讓已讀的RSS條目顯示爲藍色,未讀的默認顯示爲黑色,而後點擊每一個條目的時候要把顏色改成已讀的顏色,而且同時Winform。從上面的RSS定義能夠看到我把前三個item元素加了一個read="true"的屬性(爲了演示目的我手工加的),咱們用xslt的if語句來讀取這個屬性來動態設置RSS條目的樣式。最後xslt還要定義一個讓winform調用的javascript方法以供後面的演示。最終的XSLT以下,不太熟悉XSLT語法的能夠參考我之前貼過的帖子。 <?xml version="1.0" encoding="utf-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" /> <xsl:template match="rss/channel"> <html> <head> <title> <xsl:value-of select="title" /> </title> <SCRIPT LANGUAGE="JavaScript"> function invokeWin(obj) { obj.childNodes[0].style.color='blue'; window.external.winFunction(obj.childNodes[0].href); } function scriptFunc(str) { alert(str); } </SCRIPT> <style media="all" lang="en" type="text/css"> body { background-color:#ccc; } .ChannelTitle { font-family: Verdana; font-size: 11pt; font-weight: bold; width: 500px; text-align: center; } .PostDate { font-family: Verdana; font-size: 7pt; padding-left: 15px; } A,A:visited { text-decoration: none; color: #000 } A:link { text-decoration: none; } A:hover { text-decoration: underline; } </style> </head> <body> <xsl:apply-templates select="title" /> <ol> <xsl:apply-templates select="item" /> </ol> <div align="center">© 2008WawaSoft 2008</div> </body> </html> </xsl:template> <xsl:template match="title"> <div class="ChannelTitle"> <xsl:value-of select="text()" /> </div> <br /> </xsl:template> <xsl:template match="item"> <li> <span onclick="invokeWin(this)"> <a TARGET="_blank" href="{link}"> <xsl:if test="@read='true'"> <xsl:attribute name="style">color:blue;</xsl:attribute> </xsl:if> <xsl:value-of select="title" /> </a> </span> <span class="PostDate"> <xsl:value-of select="pubDate" /> </span> </li> </xsl:template> </xsl:stylesheet> 程序裏面呢,咱們得讓WebBrowser來顯示這個RSS,代碼以下 private void FWBTest_Load(object sender, EventArgs e) { wb1.AllowWebBrowserDrop = false; //wb1.IsWebBrowserContextMenuEnabled = false; wb1.WebBrowserShortcutsEnabled = false; wb1.ObjectForScripting = this; wb1.ScriptErrorsSuppressed = true; try { XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load("rss.xslt"); string HTMLoutput; using (StringWriter writer = new StringWriter()) { xslt.Transform("rss.xml", null, writer); HTMLoutput = writer.ToString(); } wb1.DocumentText = HTMLoutput; } catch (XsltException xsle) { Console.WriteLine("樣式表中有錯。"); } catch (XmlException xmle) { Console.WriteLine("加載樣式表時出現分析錯誤。"); } catch (Exception ex) { Console.WriteLine(ex); } } 都是WebBrowser和.net的Xml對象的基本用法。 和javascript交互也很簡單,如下分別是讓javascript調用的方法和用c#調用javascript方法的代碼。 public void winFunction(string str) { toolStripStatusLabel1.Text = string.Format("腳本執行方法:{0}", str); } private void toolStripButton1_Click(object sender, EventArgs e) { wb1.Document.InvokeScript("scriptFunc", new String[] { "這是winform調用腳本方法" }); } 關鍵點就是javascript代碼的下面這句 window.external.winFunction(obj.childNodes[0].href); 以及c#代碼下面這句 wb1.Document.InvokeScript("scriptFunc",new String[] { "這是winform調用腳本方法" }); RSS這部分演示完畢了。 winform下的富文本編輯器控件不太多,通常有兩種途徑,一種是擴展RichTextBox,要去研究rtf格式,mime協議等,一種是用WebBrowser控件,並把designMode設置爲on,而後就是和網頁的html編輯器同樣,調用一些ExecCommand方法來編輯格式等,這裏介紹後者,由於後者實現簡單,並且html格式能夠直接按原格式貼到互聯網上,通用性比較好,這裏不具體說一些編輯命令如何實現,這些能夠參考文後的參考連接,這裏只討論如何讓你的HTML文檔關閉後再加載恢復上次編輯的光標位置的功能。 這裏須要用一些mshtml對象,因此要在項目裏引用Microsoft.mshtml,引用位置默認應該是C:\Program Files\Microsoft.NET\Primary Interop Assemblies\Microsoft.mshtml.dll,我不知道這個組件是否是新安裝的windows xp,2003都有,若是沒有的話能夠把這個dll放到你項目的bin目錄下一塊兒發佈。 大體原理是這樣的,在關閉當前編輯文檔的時候獲取當前光標的位置,也就是當前選擇的元素(雖然doc.selection有多是個圖片,而不是TextRange,但咱們只考慮textRange的狀況,你們能夠寫代碼過濾掉其它狀況,若是當前編輯點不是文本類型,就不考慮恢復光標位置了,呵呵。)。而後給當前選擇元素後面插入一個小的span元素,做爲一個標識符,最後再把文檔的Body的InnerHTML保存到數據庫裏。下次從數據庫裏讀取保存的html文本,先設置到當前WebBrowser的Body的innerHTML屬性,而後經過getElementById方法找上次插入的標識符span,找到這個span就至關於找到了上次的光標位置,最後用body元素createTextRange後調用其moveToElementText方法把光標編輯位置移動到找到的位置。 相應代碼以下 private void NewDoc() { wb1.Navigate("about:blank"); IHTMLDocument2 doc = wb1.Document.DomDocument as IHTMLDocument2; doc.designMode = "On"; } private void SaveDoc() { if (wb1.Document != null) { IHTMLDocument2 doc = wb1.Document.DomDocument as IHTMLDocument2; HTMLDocumentClass documentClass = wb1.Document.DomDocument as HTMLDocumentClass; IHTMLDOMNode caret_pos = (IHTMLDOMNode)documentClass.getElementById("caret_pos"); if (caret_pos != null) caret_pos.removeNode(true); IHTMLTxtRange range = doc.selection.createRange() as IHTMLTxtRange; range.pasteHTML(caretHtml); range.collapse(true); _text = doc.body.innerHTML; doc.body.innerHTML = ""; } } private void LoadDoc() { if (!string.IsNullOrEmpty(_text)) { IHTMLDocument2 doc = wb1.Document.DomDocument as IHTMLDocument2; doc.body.innerHTML = _text; IHTMLBodyElement bodyElement = doc.body as IHTMLBodyElement; if (bodyElement != null) { IHTMLTxtRange range = bodyElement.createTextRange(); HTMLDocumentClass documentClass = wb1.Document.DomDocument as HTMLDocumentClass; IHTMLElement caret_pos = documentClass.getElementById("caret_pos"); if (caret_pos != null) { range.moveToElementText(caret_pos); range.select(); } } _text = ""; } } 注:代碼寫的不嚴謹,只用於演示目的,請勿用於生產環境。 關於Winform html編輯器的參考連接 http://windowsclient.net/articles/htmleditor.aspx http://www.codeproject.com/cs/miscctrl/editor_in_windows_forms.asp http://www.codeproject.com/KB/IP/WYSIWYG_netHTML2.aspx 關於恢復光標位置的參考連接 設置光標位置的問題:SetDocumentHTML(html) 以後, SetCaretPos(curpos) 爲什麼失效? http://topic.csdn.net/t/20050729/22/4177529.html HTML可視化編輯器中IE丟失光標位置的問題。 http://hi.baidu.com/jindw/blog/item/8c3e928ba1f04dd0fc1f10d2.html 用土辦法記憶可編輯div 內的光標位置- 極湖- by OU(連接不可用,請從google緩存裏查看) http://my.opera.com/jlake/blog/2008/05/05/div How to RemoveChild from HtmlElement from C# http://bytes.com/forum/thread453742.html 本文源碼下載地址以下 WebBrowserDemo.zip
C# WebBrowser 設置代理徹底解決方案編程
微軟webbrowser控件也就是IE插件,他的全部功能就像IE相似,固然設置也是同樣的,下面介紹下webbrowser如何設置代理,可不要用這個對抗廣告聯盟哦 You can change the proxy with InternetSetOption method from the wininet.dll, here is a example to set the proxy: using System.Runtime.InteropServices; Public struct Struct_INTERNET_PROXY_INFO { public int dwAccessType; public IntPtr proxy; public IntPtr proxyBypass; }; [DllImport("wininet.dll", SetLastError = true)] private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength); private void RefreshIESettings(string strProxy) { const int INTERNET_OPTION_PROXY = 38; const int INTERNET_OPEN_TYPE_PROXY = 3; Struct_INTERNET_PROXY_INFO struct_IPI; // Filling in structure struct_IPI.dwAccessType = INTERNET_OPEN_TYPE_PROXY; struct_IPI.proxy = Marshal.StringToHGlobalAnsi(strProxy); struct_IPI.proxyBypass = Marshal.StringToHGlobalAnsi("local"); // Allocating memory IntPtr intptrStruct = Marshal.AllocCoTaskMem(Marshal.SizeOf(struct_IPI)); // Converting structure to IntPtr Marshal.StructureToPtr(struct_IPI, intptrStruct, true); bool iReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY, intptrStruct, Marshal.SizeOf(struct_IPI)); } private void SomeFunc() { RefreshIESettings("192.168.1.200:1010"); System.Object nullObject = 0; string strTemp = String.Empty; System.Object nullObjStr = strTemp; axWebBrowser1.Navigate("http://willstay.tripod.com", ref nullObject, ref nullObjStr, ref nullObjStr, ref nullObjStr); } ------------------------------------------------------------------------------------------------------------------------------------- 昨 天作的投票機遇到個新問題,昨天開始那個投票開始如今ip地址,每一個地址只能投5票/天。若是每次更改ie的鏈接爲代理服務器,那也麻煩死了,如 果改用webclient,那昨天的2個多小時就白費了,上網一通狂收還真找到了辦法,這下好辦了,建了一個proxy.txt文檔,裏面放上從網上收到 的代理服務器,而後程序讀到一個listbox裏面,每次須要更換ip的時候只要單擊一次,就能夠還一個地址從新投票了。 附上proxy.cs using System.Runtime.InteropServices;//須要添加這個引用 public struct Struct_INTERNET_PROXY_INFO { public int dwAccessType; public IntPtr proxy; public IntPtr proxyBypass; }; [DllImport("wininet.dll", SetLastError = true)] private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength); public void RefreshIESettings(string strProxy) { const int INTERNET_OPTION_PROXY = 38; const int INTERNET_OPEN_TYPE_PROXY = 3; Struct_INTERNET_PROXY_INFO struct_IPI; // Filling in structure struct_IPI.dwAccessType = INTERNET_OPEN_TYPE_PROXY; struct_IPI.proxy = Marshal.StringToHGlobalAnsi(strProxy); struct_IPI.proxyBypass = Marshal.StringToHGlobalAnsi(」local」); // Allocating memory IntPtr intptrStruct = Marshal.AllocCoTaskMem(Marshal.SizeOf(struct_IPI)); // Converting structure to IntPtr Marshal.StructureToPtr(struct_IPI, intptrStruct, true); bool iReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY, intptrStruct, Marshal.SizeOf(struct_IPI)); } 使用的時候,調用RefreshIESettings py.proxy py1 = new proxy(); py1.RefreshIESettings(」221.4.155.51:3128″); System.Object nullObject = 0; string strTemp = String.Empty; System.Object nullObjStr = strTemp; webBrowser1.Navigate(」http://www.hfxsy.cn」, null, null, null);
C# WebBrowser控件讀html流並顯示
C# WebBrowser控件讀html流並顯示 2008-04-22 08:52 677人閱讀 評論(2) 收藏 舉報 //環境VS2005,WinXPSP2 //test.txt 爲html源代碼 private void Form1_Load(object sender, EventArgs e) { string str = null; StreamReader sr = new StreamReader("D:/test.txt", Encoding.Default); webBrowser1.Navigate("about:blank"); webBrowser1.Document.OpenNew(true); str = sr.ReadToEnd(); webBrowser1.Document.Write(str); }
C# webBrowser 加載網頁時實現進度顯示
private void Fmain_Load(object sender, EventArgs e) { Uri uri= new Uri("http://www.baidu.com"); webBrowser1.Url = uri; webBrowser1.ProgressChanged += new WebBrowserProgressChangedEventHandler(webBrowser1_ProgressChanged); } private void webBrowser1_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e) { progressBar1.Visible = true; if ((e.CurrentProgress > 0) && (e.MaximumProgress > 0)) { progressBar1.Maximum = Convert.ToInt32(e.MaximumProgress);//設置正在加載的文檔總字節數 progressBar1.Step = Convert.ToInt32(e.CurrentProgress);////獲取已下載文檔的字節數 progressBar1.PerformStep(); } else if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)//加載完成後隱藏進度條 { progressBar1.Value = 0; progressBar1.Visible = false; } }
C# webbrowser 代理
百度,google加本身理解後,將所得方法總結一下: 方法1:修改註冊表Software//Microsoft//Windows//CurrentVersion//Internet Settings下 ProxyEnable和ProxyServer。這種方法適用於局域網用戶,撥號用戶無效。 1 public partial class Form1 : Form 2 { 3 4 //用於刷新註冊表 5 [DllImport(@"wininet", 6 SetLastError = true, 7 CharSet = CharSet.Auto, 8 EntryPoint = "InternetSetOption", 9 CallingConvention = CallingConvention.StdCall)] 10 11 12 public static extern bool InternetSetOption 13 ( 14 int hInternet, 15 int dmOption, 16 IntPtr lpBuffer, 17 int dwBufferLength 18 ); 19 20 private void btnStart_Click(object sender, EventArgs e) 21 { 22 RegistryKey pregkey; 23 pregkey = Registry.CurrentUser.OpenSubKey("Software//Microsoft//Windows//CurrentVersion//Internet Settings", true); 24 if (pregkey == null) 25 { 26 Console.WriteLine("鍵值不存在"); 27 } 28 else 29 { 30 pregkey.SetValue("ProxyEnable", 1); 31 pregkey.SetValue("ProxyServer", "代理地址"); 32 //激活代理設置 33 InternetSetOption(0, 39, IntPtr.Zero, 0); 34 InternetSetOption(0, 37, IntPtr.Zero, 0); 35 webBrowser1.Navigate(txtweb.Text, false); 36 // System.Threading.Thread.Sleep(10000); 37 } 38 } 39} 方法2: 修改註冊表Software//Microsoft//Windows//CurrentVersion//Internet Settings//Connections下以你撥號鏈接名爲鍵的值,該鍵爲二進制。這種方法適用於撥號用戶。 public partial class FrmMain : Form { [DllImport(@"wininet", SetLastError = true, CharSet = CharSet.Auto, EntryPoint = "InternetSetOption", CallingConvention = CallingConvention.StdCall)] public static extern bool InternetSetOption ( int hInternet, int dmOption, IntPtr lpBuffer, int dwBufferLength ); //將值轉換爲註冊表中的二進制值 public byte ChangeTobyte(char i) { byte key = 0; switch (i) { case '0': key = 48; break; case '1': key = 49; break; case '2': key = 50; break; case '3': key = 51; break; case '4': key = 52; break; case '5': key = 53; break; case '6': key = 54; break; case '7': key = 55; break; case '8': key = 56; break; case '9': key = 57; break; case '.': key = 46; break; case ':': key = 58; break; } return key; } private void btnStart_Click(object sender, EventArgs e) { int i = ("代理地址").Length; byte[] key = new byte[50]; char[] source = ("代理地址").ToCharArray(); key[0] = 60; key[4] = 3; key[8] = 3; key[12] = (byte)i; for (int ii = 0; ii < source.Length; ii++) { key[16 + ii] = ChangeTobyte(source[ii]); } string sDirectX = ""; for (int k = 0; k < key.Length; k++) { if (key[k] != 0) { sDirectX += key[k] + " "; } } //MessageBox.Show(sDirectX); RegistryKey pregkey; pregkey = Registry.CurrentUser.OpenSubKey("Software//Microsoft//Windows//CurrentVersion//Internet Settings//Connections", true); if (pregkey == null) { Console.WriteLine("鍵值不存在"); } else { pregkey.SetValue("撥號名字對應鍵值", key, RegistryValueKind.Binary); //激活代理設置 InternetSetOption(0, 39, IntPtr.Zero, 0); InternetSetOption(0, 37, IntPtr.Zero, 0); webBrowser1.Navigate(txtweb.Text, false); webBrowser1.Refresh(); } } } 方法3: 使用c#自帶的webproxy類,使用這種方法能夠得到目標網站的響應,但我不會把這種響應用IE反饋出來,有高手幫個忙麼? 網上的代碼說是MSDN的: HttpWebRequest myWebRequest=(HttpWebRequest)WebRequest.Create("http://www.microsoft.com"/); WebProxy myProxy=new WebProxy(); // Obtain the 'Proxy' of the Default browser. myProxy=(WebProxy)myWebRequest.Proxy; 這行我編譯不經過 // Print the Proxy Url to the console. Console.WriteLine("/nThe actual default Proxy settings are {0}",myProxy.Address); try { Console.WriteLine("/nPlease enter the new Proxy Address that is to be set:"); Console.WriteLine("(Example:http://myproxy.example.com:port/)"); string proxyAddress; proxyAddress =Console.ReadLine(); if(proxyAddress.Length>0) { Console.WriteLine("/nPlease enter the Credentials "); Console.WriteLine("Username:"); string username; username =Console.ReadLine(); Console.WriteLine("/nPassword:"); string password; password =Console.ReadLine(); // Create a new Uri object. Uri newUri=new Uri(proxyAddress); // Associate the newUri object to 'myProxy' object so that new myProxy settings can be set. myProxy.Address=newUri; // Create a NetworkCredential object and associate it with the Proxy property of request object. myProxy.Credentials=new NetworkCredential(username,password); myWebRequest.Proxy=myProxy; } Console.WriteLine("/nThe Address of the new Proxy settings are {0}",myProxy.Address); HttpWebResponse myWebResponse=(HttpWebResponse)myWebRequest.GetResponse(); 我改了下: HttpWebRequest myWebRequest = (HttpWebRequest)WebRequest.Create("http://www.123cha.com"); WebProxy myProxy = new WebProxy("代理地址", true); try { Console.WriteLine("/nThe Address of the new Proxy settings are {0}", myProxy.Address); HttpWebResponse myWebResponse = (HttpWebResponse)myWebRequest.GetResponse(); webBrowser1.DocumentStream = myWebResponse.GetResponseStream(); } catch { }
C# 設置IE瀏覽器的代理
思路:主要是經過修改註冊表實現的。 代碼以下: using System.Runtime.InteropServices; using Microsoft.Win32; //You can change the proxy with InternetSetOption method from the wininet.dll, here is a example to set the proxy [DllImport("wininet.dll", SetLastError = true)] private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength); /// <summary> /// 設置IE代理 /// </summary> /// <param name="isNeedProxy">是否須要代理</param> private static void SettingsIEBrowserProxy(bool isNeedProxy) { const string INTERNETSETTINGSKEYPATH = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"; RegistryKey settings = null; try { settings = Registry.CurrentUser.OpenSubKey(INTERNETSETTINGSKEYPATH, true); //更改健值,設置代理, if (settings != null) { if (isNeedProxy) { settings.SetValue("ProxyEnable", 1); //ip.port 就是代理服務器的ip,port就是端口 settings.SetValue("ProxyServer", ip +":" + port); } else { //取消代理 settings.SetValue("ProxyEnable", 0); } } //激活代理設置 InternetSetOption(IntPtr.Zero, 39, IntPtr.Zero, 0); InternetSetOption(IntPtr.Zero, 37, IntPtr.Zero, 0); } catch (Exception ex) { throw ex; } finally { if (settings != null) { settings.Close(); } } } 這樣就能夠實現IE經過代理,來打開網頁。
C# 經過http代理服務器,實現代理登陸
C# 經過http代理服務器,實現代理登陸 今天接到一個需求,須要經過http代理服務器,實現代理登陸。 思路很簡單: 實例化一個代理對象; 把上面的代理對象實例賦給HttpWebRequest、WebService服務對象的Proxy屬性,就實現了代理登陸。 看下面的代碼: //第一步:實例化代理對象,proxyServerAddress表示代理服務器地址,false表示,若代理服務器是本地地址,則跳過http代理服務器。http代理服務器地址通常形式:http://ip:端口 Web代理 proxy = new Web代理("代理服務器地址",false); //第二步:給代理對象加上驗證屬性,要看你的http代理服務器是否須要身份驗證;proxyname代理用戶名,proxypassword代理密碼,domainname域名 proxy.Credentials = new NetworkCredential(proxyname,proxypassword,domainname); 因爲項目上使用的登陸是用webservice實現的,這樣形成也能夠用http代理服務器實現代理登陸; //第三步:實例化登陸服務 ProxyInterfaceService loginService=new ProxyInterfaceService(); //第四步:給登陸服務對象的代理屬性賦值爲第一步實例化的代理對象 loginService.Proxy = proxy; loginService.login("登陸用戶名","登陸密碼",null); 如果用http實現的登陸也是同樣的,只要修改上面的第3、四步的代碼就好了。代碼以下: HttpWebRequest request = WebRequest.Create("真正登陸的服務器地址") as HttpWebRequest; request.Proxy=proxy; 就這樣實現了http代理登陸,很簡單吧。
C# 爲WebBrowser設置代理,打開網頁
WebBrowser控件是基於IE瀏覽器的,因此它的內核功能是依賴於IE的,相信作.NET的人都知道。 今天的主題,和上一篇文章應該是差很少的,都是經過代理來實現功能的。 請看下面的代碼: //1.定義代理信息的結構體 public struct Struct_INTERNET_PROXY_INFO { public int dwAccessType; public IntPtr proxy; public IntPtr proxyBypass; }; //You can change the proxy with InternetSetOption method from the wininet.dll, here is a example to set the proxy //這個就是設置一個Internet 選項,其實就是能夠設置一個代理 [DllImport("wininet.dll", SetLastError = true)] private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength); //設置代理的方法 //strProxy爲代理IP:端口 private void InternetSetOption(string strProxy) { //設置代理選項 const int INTERNET_OPTION_PROXY = 38; //設置代理類型 const int INTERNET_OPEN_TYPE_PROXY = 3; //設置代理類型,直接訪問,不須要經過代理服務器了 const int INTERNET_OPEN_TYPE_DIRECT = 1; Struct_INTERNET_PROXY_INFO struct_IPI; // Filling in structure struct_IPI.dwAccessType = INTERNET_OPEN_TYPE_PROXY; //把代理地址設置到非託管內存地址中 struct_IPI.proxy = Marshal.StringToHGlobalAnsi(strProxy); //代理經過本地鏈接到代理服務器上 struct_IPI.proxyBypass = Marshal.StringToHGlobalAnsi("local"); // Allocating memory //關聯到內存 IntPtr intptrStruct = Marshal.AllocCoTaskMem(Marshal.SizeOf(struct_IPI)); if (string.IsNullOrEmpty(strProxy) || strProxy.Trim().Length == 0) { strProxy = string.Empty; struct_IPI.dwAccessType = INTERNET_OPEN_TYPE_DIRECT; } // Converting structure to IntPtr //把結構體轉換到句柄 Marshal.StructureToPtr(struct_IPI, intptrStruct, true); bool iReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY, intptrStruct, Marshal.SizeOf(struct_IPI)); } private void button1_Click(object sender, EventArgs e) { InternetSetOption("192.168.6.218:3128"); webBrowser1.Navigate("http://www.baidu.com", null, null, null); } 上面是代碼是設置代理,要是取消代理怎麼實現? 很簡單,把調用InternetSetOption(string strProxy) 函數中的strProxy參數設置爲空就好了。 例如: private void button2_Click(object sender, EventArgs e) { InternetSetOption(string.Empty); webBrowser1.Navigate("http://www.baidu.com", null, null, null); }