c# WebBrowser开发参考资料

http://hi.baidu.com/motiansen/blog/item/9e99a518233ca3b24aedbca9.html
==================
使用ObjectForScripting属性,可启用 WebBrowser 控制项所装载之 Web 网页与包含 WebBrowser 控制项之应用程式间的通讯。
这个属性可让您整合动态超文字标记语言 (DHTML) 程式码与用户端应用程式程式码。
指定给这个属性的物件可让 Web 网页指令码做为 window.external 物件,这个物件是为了存取主应用程式而提供的内建 DOM 物件。

private void btnScriptEvent_Click(object sender, EventArgs e)
{
           webBrowser1.ObjectForScripting = this;

string szWebBrowserText = "<html>" +
                "<head>" +
                "<title></title>"+                    
                 "</head>" +
               "<body KeyDown()\" event.returnValue=false\">"+
               
               "Please enter your name:<br/>"+
                 "<input type='text' /><br/>"+
                 "<font >Click Here</font>"+
                "</body></html>";

webBrowser1.DocumentText = szWebBrowserText;
         }
        public void ClickEvent(string userName)
        {
            // Simply echo out the name that the user typed in the input box of the HTML page
            if (System.Threading.Thread.CurrentThread.CurrentUICulture.TextInfo.IsRightToLeft == true)
                 MessageBox.Show("Hello " + userName, "Managed Web Browser Sample", MessageBoxButtons.OK,

MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign | MessageBoxOptions.RtlReading);
            else
                 MessageBox.Show("Hello " + userName, "Managed Web Browser Sample", MessageBoxButtons.OK,

MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);

}

= szWebBrowserText;

==================================
异常类型 条件 
ArgumentException
设置该属性时指定的值为非公共类型的实例。

- 或 -

设置该属性时指定的值为非 COM 可见的类型的实例。有关更多信息,请参见 Marshal.IsTypeVisibleFromCom。

备注 
使用该属性启用 WebBrowser 控件承载的网页与包含 WebBrowser 控件的应用程序之间的通信。使用该属性可以将动态 HTML (DHTML) 代码与客户端

应用程序代码集成在一起。为该属性指定的对象可作为 window.external 对象(用于主机访问的内置 DOM 对象)用于网页脚本。

可以将此属性设置为希望其公共属性和方法可用于脚本代码的任何 COM 可见的对象。可以通过使用 ComVisibleAttribute 对类进行标记使其成为

COM 可见的类。

若要从客户端应用程序代码调用网页中定义的函数,请使用可从 Document 属性检索的 HtmlDocument 对象的 HtmlDocument.InvokeScript 方法。

示例 
下面的代码示例演示如何使用 ObjectForScripting 属性。在该示例中,ObjectForScripting 属性被设置为当前窗体。

---------

using System;
using System.Windows.Forms;
using System.Security.Permissions;

[PermissionSet(SecurityAction.Demand, )]
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public class Form1 : Form
{
    private WebBrowser webBrowser1 = new WebBrowser();
    private Button button1 = new Button();

[STAThread]
    public static void Main()
    {
        Application.EnableVisualStyles();
        Application.Run(new Form1());
    }

public Form1()
    {
        button1.Text = "call script code from client code";
        button1.Dock = DockStyle.Top;
        button1.Click += new EventHandler(button1_Click);
        webBrowser1.Dock = DockStyle.Fill;
        Controls.Add(webBrowser1);
        Controls.Add(button1);
        Load += new EventHandler(Form1_Load);
    }

private void Form1_Load(object sender, EventArgs e)
    {
        webBrowser1.AllowWebBrowserDrop = false;
        webBrowser1.IsWebBrowserContextMenuEnabled = false;
        webBrowser1.WebBrowserShortcutsEnabled = false;
        webBrowser1.ObjectForScripting = this;
        // Uncomment the following line when you are finished debugging.
        //webBrowser1.ScriptErrorsSuppressed = true;

webBrowser1.DocumentText =
            "<html><head><script>" +
            "function test(message) { alert(message); }" +
            "</script></head><body><button " +
            "window.external.Test('called from script code')\">" +
            "call client code from script code</button>" +
            "</body></html>";
    }

public void Test(String message)
    {
        MessageBox.Show(message, "client code");
    }

private void button1_Click(object sender, EventArgs e)
    {
        webBrowser1.Document.InvokeScript("test",
            new String[] { "called from client code" });
    }

}

---------------------------------------------
// Navigates to the URL in the address box when 
// the ENTER key is pressed while the ToolStripTextBox has focus.
private void toolStripTextBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        Navigate(toolStripTextBox1.Text);
    }
}

// Navigates to the URL in the address box when 
// the Go button is clicked.
private void goButton_Click(object sender, EventArgs e)
{
    Navigate(toolStripTextBox1.Text);
}

// Navigates to the given URL if it is valid.
private void Navigate(String address)
{
    if (String.IsNullOrEmpty(address)) return;
    if (address.Equals("about:blank")) return;
    if (!address.StartsWith("http://") &&
        !address.StartsWith("https://"))
    {
        address = "http://" + address;
    }
    try
    {
        webBrowser1.Navigate(new Uri(address));
    }
    catch (System.UriFormatException)
    {
        return;
    }
}

// Updates the URL in TextBoxAddress upon navigation.
private void webBrowser1_Navigated(object sender,
    WebBrowserNavigatedEventArgs e)
{
    toolStripTextBox1.Text = webBrowser1.Url.ToString();
}

====================================================================================
HtmlElement.DomElement 属性
属性值
元素的 COM IUnknown 指针,可以将其强制转换为 HTML 元素接口中的某一个接口,如 IHTMLElement。 
备注 
HtmlElement 为 Internet Explorer 文档对象模型 (DOM) 的包装,它是用组件对象模型 (COM) 编写而成。如果需要访问基础 COM 接口中的未公开

属性或方法(如 IHTMLElement),可以使用此对象查询它们。

为了使用非托管接口,需要将 MSHTML 库 (mshtml.dll) 导入到应用程序中。但是,也可以使用 Invoke 方法执行未公开属性和方法。

示例 
下面的代码示例使用非托管接口获取当前选定的文本,并使用由用户选择的 URL 将其转换为超链接。编写此代码时,假定窗体拥有一个名为

WebBrowser1 的 WebBrowser 控件,并假定已经以引用的形式将非托管 MSHTML 库添加到项目中。

C# 复制代码
private void CreateHyperlinkFromSelection()
{
    if (webBrowser1.Document != null)
    {

mshtml.IHTMLDocument2 iDoc = (mshtml.IHTMLDocument2)webBrowser1.Document.DomDocument;

if (iDoc != null) 
        {
            mshtml.IHTMLSelectionObject iSelect = iDoc.selection;
            if (iSelect == null)
            {
                MessageBox.Show("Please select some text before using this command.");
                return;
            }

mshtml.IHTMLTxtRange txtRange = (mshtml.IHTMLTxtRange)iSelect.createRange();

// Create the link.
            if (txtRange.queryCommandEnabled("CreateLink"))
            {
                Object o = null;
                txtRange.execCommand("CreateLink", true, o);
            }
        }
    }
}

http://msdn.microsoft.com/zh-cn/library/system.windows.forms.htmlelement.domelement(VS.80).aspx

===========================================================
使用webbrowser和mshtml.dll获取网页源代码的问题
悬赏分:100 - 解决时间:2006-7-19 16:52
我使用C#做一个程序,其中涉及到一个功能,在输入指定网址之后,需要获取html源代码进行分析。 
我使用了webbrowser控件和mshtml.dll 
但是只能获取到普通页面的源代码 
一旦采集带有cookie控制的页面就会失败。 
谁能帮帮忙?

我对于webbrowser的使用并不很清楚,这个空间是否能直接获取html代码呢? 
mshtml.dll说是可以对html代码进行分析。但如何使用?

有谁能给出说明和源代码,感激不尽。
问题补充:我使用以下代码获取webbrowser中的html,但是有个很奇怪的问题。我每次点完按钮都会发现文本框中显示的html都不全,而且都把同一

页面的html显示了很多遍。如果页面内容较大则会引起程序死掉。 
为什么呢?
提问者: willgo - 助理 二级 最佳答案
private void button1_Click(object sender, System.EventArgs e) { 
object url=\"http://www.google.com\"; 
object nothing=null; 
this.axWebBrowser1.Navigate2(ref url,ref nothing,ref nothing,ref nothing,ref nothing); 
this.axWebBrowser1.DownloadComplete+=new System.EventHandler(this.button2_Click); 
}

private void button2_Click(object sender, System.EventArgs e) { 
this.textBox1.Text=\"\"; 
mshtml.IHTMLDocument2 doc=(mshtml.IHTMLDocument2)this.axWebBrowser1.Document; 
mshtml.IHTMLElementCollection all=doc.all; 
System.Collections.IEnumerator enumerator=all.GetEnumerator(); 
while(enumerator.MoveNext() && enumerator.Current!=null) 

mshtml.IHTMLElement element=(mshtml.IHTMLElement)(enumerator.Current); 
if(this.checkBox1.Checked==true) 

this.textBox1.Text+=\"\\r\\n\\r\\n\"+element.innerHTML

else 

this.textBox1.Text+=\"\\r\\n\\r\\n\"+element.outerHTML


}

=============
注意 本例程中使用了一个未公开的GUID,其在将来的系统中可以发生变更。

  1、定义 IOleCommandTarget 接口

  为定义一个.NET接口以获得关于一个COM接口的参考,请遵从下列步骤:

  1) 赋予.NET接口相应的COM接口的GUID值;

  2) 包含对接口中所有方法的类型声明;

  3) 包含对Mshtml.dll和Shdocvw.dll文件的参考,在Visual C# .NET工程中操作,请遵从:

  A. 在项目菜单下单击“添加引用”;

  B. 单击“COM” 选项卡;

  C. 双击“Microsoft HTML Object Library” 和“Microsoft Internet Controls”。

posted @ 2011-07-15 14:17 也风 阅读(25) 评论(0) 编辑
 

C# WebBrowser控件禁用超链接转向、脚本错误提示、默认右键菜单和快捷键

2011-06-18 11:45:39|  分类: .net相关 |  标签: |字号大中小 订阅

 

从 VS2005开始,VS自带的 WebBrowser控件,就已经相当友好了,可控性非常高了。

Winform 结合 WebBrowser 做UI开发,也是一种非常流畅的模式了, 微软的VS IDE 系列的安装程序, 基本都是这个模式的

在使用WebBrowser做UI的时候,我们有时不希望里面的链接被用户点击,更不希望弹出烦人的脚本错误提示框,也不希望用户能点出右键的IE菜单,要做到这些,其实都是很easy地…

禁用错误脚本提示

将 WebBrowser控件的 ScriptErrorsSuppressed 设为 true

禁用右键菜单

将 WebBrowser 的 IsWebBrowserContextMenuEnabled 设为 false

禁用快捷键

将 WebBrowser 的 WebBrowserShortcutsEnabled 设为 false

禁用超链接

超链接分为两种,一种是 当前窗口直接转向, 一种是 在新窗口中打开

当然窗口直接转向:

将 WebBrowser 的 AllowNavigation 设为 false

在新窗口中打开:

禁用新窗口打开,需要处理 WebBrowser 的 NewWindow 事件 
private void webBrowser1_NewWindow(object sender, CancelEventArgs e)
{
     e.Cancel = true;
}

做完上面的工作,基本就完工了,还有最后一点需要注意,那就是 Drag-And-Drop

记得将 WebBrowser 的 AllowWebBrowserDrop 设为 false

posted @ 2011-07-15 14:05 也风 阅读(19) 评论(0) 编辑
   2011年4月22日
我想你很快就会在程序中需要比较两个字符串是否相等。在C中,你知道可以使用strcmp(string1,string2)函数: 
char string1[] = "Yo"; 
char string2[] = "Yo"; 
if (strcmp(string1, string2) == 0) { 
  // do the following code 
条件表达式的结果将会是真,从而执行if语句大括号中的代码。在Cocoa中,也是相类似的。记住,当我们声明一个字符串时: 
NSString *aString; 
变量 
aString并不真正包含一个字符串对象—它是指向内存中字符串对象的指针。我们称呼这类变量的另一个名称是对象标识符,因为它是标识内存 
中的一个对象而不是保存这个对象。这个技术细节有很重要的含义,指针是一个内存位置的地址。考虑下面我们通过“==”比较两个字符串对象的情 
况: 
NSString *string1 = @"A String"; 
NSString *string2 = @"A String"; 
这里,我们静态地创建了两个NSString对象,它们是两个不同的对象,但它们都包含相同的值。现在,如果我们使用 
C的等号操作符, 
BOOL result = string1 == string2; 
等号表达式的值将为“不等”(Objective-C中是“false”)。对,是“不等”。我们看着是相等的,但是这行代码比较的不是字符串—它比较的是它们内 
存地址的值。由于它们不是一个相同的对象,它们存在于各自的内存位置,因此string1的地址和string2的并不相同。这说明了表达式的值为什么为 
假。 
现在,如果我们象下面这么做: 
NSString *string1 = @"A String.";
NSString *string2 = string1; 
BOOL result = string1 == string2; 
这次等号操作符将返回 
“真”,因为string1和string2都指向相同的对象的内存位置—它们的地址相同。NSString *string2=string1;这行 
把string1的地址存到了string2中。所以现在地址是相等了,就好象我们在等式中表现的一样。 
现在让我们归纳一下,如果变量的数据类型是int,double,char或float,等号操作符会如我们想象那么起作用,因为这些变量的数据类型不 
是指针,它们实际上包含了数据的值。只有对象变量(和所有的指针变量)会成为这一现象的牺牲品。 
所以,我希望你习惯有些老方法在面向对象编程中不再适用。我现在将示范怎么进行比较和相等判断。 
当你想判断两个对象是否相等时,你必须调用相应的类中的比较method。在NSString中,最直接的是- isEqualToString:这个method,它 
的参数是一个NSString对象,返回值是一个布尔值表明接收者字符串是否与参数字符串相等。现在,我们可以试验一下: 
NSString *string1 = @"A String."; 
NSString *string2 = @"A String."; 
BOOL result = [string1 isEqualToString: string2]; 
这个语句将返回 
“真”,因为string1和string2指向的对象的值是相等的。一个更通用的method是- compare:,它可以比较字符串时候和接收者的 
相等,或者这个字符串是在接收者之前还是之后(按照字典的顺序,也就是词汇顺序)。compare:的返回类型是一种称 
为NSComparisonResult的 
Cocoa数据类型,它有三个可能的值 
:NSOrderedAscending,NSOrderedSame,NSOrderedDescending(它们只是在基础框架中定义的常数,分别等于整数-1,0,1)。 
所以,我们可以按照下面的方法使用compare: 
NSString *string1 = @"aardvark"; 
NSString *string2 = @"tarsier"; 
BOOL result = [string1 compare: string2] == NSOrderedAscending; 
因为string2在string1的字母顺序之后,发给string1的消息将返回NSOrderedAscending,由于我们使用相等操作符来 
与NSOrderedAscending进行判断,所以结果为“真”。这相当于说string2大于string1。 
通过把NSOrderedAscending替换为NSOrderedSame或NSOrderedDescending,我们可以判断接收着(string1)是否与参数(string2) 
相等,或者string2按字母顺序排在string1之前。 
在这个系统中,大写字母小于小写字母。所以,下面的计算结果为“真”: 
NSString *string1 = @"Aardvark"; 
NSString *string2 = @"aardvark"; 
BOOL result = [string1 compare: string2] == NSOrderedAscending; 
这时因为在词汇顺序上 
“Aardvark”在“aardvark”之前(想象一下字典中的单词排列顺序)。如果你想不考虑大小写地比较字符串,使 
用-caseInsensitiveCompare:。这个method的使用方法为(使用与前面一个例子相同的字符串): 
BOOL result = [string1 caseInsensitiveCompare: string2] == NSOrderedSame; 
结果将为 
“真” 
这是你可以使用的一些基本的字符串比较 
method。如果你需要比这里讲的更多的method,你可以仔细读一下类的文档,你可以找到一些给你更大 
灵活性和选择的字符串比较method。
posted @ 2011-04-22 10:29 也风 阅读(36) 评论(0) 编辑
   2010年12月8日

1 取得当前行号、列号。
 
int row=e.Row; 
int count=e.Count;
或者:
int rowindex = fpSpread1.ActiveSheet.ActiveRowIndex;
int columnindex = fpSpread1.ActiveSheet.ActiveColumnIndex;

2 单击一行变颜色。

private void spdResult_CellClick(object sender, FarPoint.Win.Spread.CellClickEventArgs e)
  {
   //单击Spread列头时,什么也不处理

if(!e.ColumnHeader)
   {
    if(spdResult.Sheets[0].Rows.Count!=0)
    {
     for(int i=0;i<spdResult.Sheets[0].Rows.Count;i++)
     {
      spdResult.Sheets[0].Rows[i].BackColor=System.Drawing.Color.White;
     }
     int row=e.Row;
     spdResult.Sheets[0].Rows[row].BackColor=System.Drawing.Color.FromArgb(((System.Byte)(192)), ((System.Byte)(255)), ((System.Byte)(255)));
    }
   }
  }

3 将Spread的单元格内容付值给一控件的Text

txtItemCD.Text = spdResult.Sheets[0].Cells[row,count].Text;

4 给Spread的指定单元格付值。

spdResult.Sheets[0].Cells[row,count].Text = txtItemCD.Text;

5 通过上下光标键改变选中行颜色

private void spdResult_LeaveCell(object sender, FarPoint.Win.Spread.LeaveCellEventArgs e)
  {
   //首先检查spread行数是否为0
   if(spdResult.Sheets[0].Rows.Count==0)
   {
    return;
   }
   else
   {
    for(int i=0;i<spdResult.Sheets[0].Rows.Count;i++)
    {
     spdResult.Sheets[0].Rows[i].BackColor=System.Drawing.Color.White;
    } 
    int row=e.NewRow;
    spdResult.Sheets[0].Rows[row].BackColor=System.Drawing.Color.FromArgb(((System.Byte)(192)), ((System.Byte)(255)), ((System.Byte)(255))); 
   }
  }

6 下拉列表加载数据(ComBobox) 
・ 列表追加(适合于数据量少的情况)

FarPoint.Win.Spread.CellType.ComboBoxCellType cb4 = new FarPoint.Win.Spread.CellType.ComboBoxCellType();
   cb4.ListWidth = 96;
   cb4.Editable = true;
   cb4.MaxDrop = 10;
   cb4.MaxLength = 1;
   string[] priceTagList = new string[]{" 0 无"," 1 有"};
   cb4.Items = priceTagList;
   this.spdSetList.ActiveSheet.Columns[4].CellType = cb4;

・ 从数据库追加

FarPoint.Win.Spread.CellType.ComboBoxCellType cb12 = new FarPoint.Win.Spread.CellType.ComboBoxCellType();
   cb12.ListWidth = 150;
   cb12.Editable = true;
   cb12.MaxDrop = 10;
   cb12.MaxLength = 8;

//dsEmployee:数据集Dataset,已经加载好数据的Dataset
   string[] employeeList = DataSetToArray(dsEmployee, 8);
   cb12.Items = employeeList;
   this.spdSetList.ActiveSheet.Columns[12].CellType = cb12;

private string[] DataSetToArray(DataSet ds, int BlankNum)
  {
   int i = 0;
   int NumLength = 0;
   string[] returnArray = new string[ds.Tables[0].Rows.Count];

DataRow foundRows = ds.Tables[0].Rows[ds.Tables[0].Rows.Count -1];
   NumLength = foundRows[0].ToString().Length;

foreach(DataRow dr in ds.Tables[0].Rows)
   {
    returnArray[i] = dr[0].ToString().PadLeft(BlankNum, ' ') + " " + dr[1].ToString();
    i++;
   }
   return returnArray;
  }

7 Focus移动(跨列)

public frmProdSetDetail()
  {
   InitializeComponent();
   IsMod = flag;

FarPoint.Win.Spread.InputMap im;
   im = spdResult.GetInputMap(InputMapMode.WhenFocused);
   im.Put(new Keystroke(Keys.Enter,Keys.None),SpreadActions.MoveToNextColumnWrap);
   im.Put(new Keystroke(Keys.Tab,Keys.None),SpreadActions.MoveToNextColumnWrap);

im = spdResult.GetInputMap(InputMapMode.WhenAncestorOfFocused);
   im.Put(new Keystroke(Keys.Enter,Keys.None),SpreadActions.MoveToNextColumnWrap);
   im.Put(new Keystroke(Keys.Tab,Keys.None),SpreadActions.MoveToNextColumnWrap);
  }

指定单元格获得焦点

this.fpSpread1.ActiveSheet.SetActiveCell(row,column);

8 事件触发顺序

_Enter    _EnterCell      _EditModeOn      _EditChange      _EditModeOff      _LeaveCell

9 用隐藏列保存原始数据

10 设定列类型

private void SpreadSetting()
  {
   string[] ProductHandleTypeList = new string[]{" ","1 販売/仕入","2 販売","3 仕入"};
  
   FarPoint.Win.Spread.CellType.ComboBoxCellType cb3 = new FarPoint.Win.Spread.CellType.ComboBoxCellType();
   cb3.ListWidth = 100;
   cb3.Editable = true;
   cb3.MaxDrop = 5;
   cb3.MaxLength = 1;
   cb3.Items = ProductHandleTypeList;

this.spdResult.ActiveSheet.Columns[5].CellType = cb3;
 
   //设置一般数据型

FarPoint.Win.Spread.CellType.NumberCellType nmbrcell = new FarPoint.Win.Spread.CellType.NumberCellType();
   nmbrcell.ShowSeparator = false;
   nmbrcell.DecimalPlaces = 0;
   nmbrcell.LeadingZero = FarPoint.Win.Spread.CellType.LeadingZero.UseRegional;
   nmbrcell.MaximumValue = 9999;
   nmbrcell.MinimumValue = 1;
   this.spdResult.ActiveSheet.Columns[13].CellType = nmbrcell;

//设置JAN

FarPoint.Win.Spread.CellType.NumberCellType nmbrcellJan = new FarPoint.Win.Spread.CellType.NumberCellType();
   nmbrcellJan.ShowSeparator = false;
   nmbrcellJan.DecimalPlaces = 0;
   nmbrcellJan.LeadingZero = FarPoint.Win.Spread.CellType.LeadingZero.UseRegional;
   nmbrcellJan.MaximumValue = 9999999999999;
   nmbrcellJan.MinimumValue = 0;
   this.fpSpread1.ActiveSheet.Columns[0].CellType = nmbrcellJan;
   this.fpSpread1.ActiveSheet.Columns[0].HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Left;

//

FarPoint.Win.Spread.CellType.NumberCellType numberCellType1 = new FarPoint.Win.Spread.CellType.NumberCellType();
   numberCellType1.ShowSeparator = true;
   numberCellType1.DecimalPlaces = 0;
   numberCellType1.LeadingZero = FarPoint.Win.Spread.CellType.LeadingZero.UseRegional;
   numberCellType1.MaximumValue = 99999999;
   numberCellType1.MinimumValue = 0;
   this.spdResult.ActiveSheet.Columns[20].CellType = numberCellType1;

//%数的设定

FarPoint.Win.Spread.CellType.PercentCellType prctcell = new FarPoint.Win.Spread.CellType.PercentCellType(); 
   prctcell.PercentSign = "%";
   this.spdResult.ActiveSheet.Columns[33].CellType = prctcell;
   
   //日期的设定

FarPoint.Win.Spread.CellType.DateTimeCellType datecell = new FarPoint.Win.Spread.CellType.DateTimeCellType(); 
   datecell.MaximumDate = new System.DateTime(2050, 12, 31, 0, 0, 0, 0);
   datecell.MinimumDate = new System.DateTime(2001, 1, 1, 0, 0, 0, 0);

this.spdResult.ActiveSheet.Columns[27,30].CellType = datecell;
 }

11 列、单元格锁定

//锁定

this.fpSpread1.ActiveSheet.Columns[0,4].Locked = true;//锁定列范围

this.fpSpread1.ActiveSheet.Columns[0].Locked = true;//锁定单列

//解锁

this.fpSpread1.ActiveSheet.Columns[0,4].Locked = false;//解锁列范围

this.fpSpread1.ActiveSheet.Columns[0].Locked = false;

12 Spread追加行、列

//追加行

int rowindex = this.fpSpread1.ActiveSheet.Rows.Count;
   this.fpSpread1.ActiveSheet.Rows.Add(rowindex,1);

//追加列

int columnindex = this.fpSpread1.ActiveSheet.Columns.Count;
   this.fpSpread1.ActiveSheet.Columns.Add(columnindex,1);

13 行、列删除

//删除行

this.fpSpread1.ActiveSheet.Rows.Remove(startindex,count);

//追加列

this.fpSpread1.ActiveSheet.Columns.Remove(startindex,count);

14 button事件

private void spdSetList_ButtonClicked(object sender, FarPoint.Win.Spread.EditorNotifyEventArgs e)
  {
   int rowCount = e.Row;
   int columnCount = e.Column;

if (e.Column == 16)
   {
    if (message.ShowMessage("ConfirmDelete", "選択したライン") == DialogResult.Yes)
    {
     string DeleteTag = this.spdSetList.ActiveSheet.Cells[rowCount, columnCount+1].Text.Trim();
     if (DeleteTag == "0" || DeleteTag == "2")
     {
      this.spdSetList.ActiveSheet.Cells[rowCount, columnCount+1].Text = "3";
      this.spdSetList.ActiveSheet.Cells[rowCount,columnCount+1].BackColor = clrWater;
      this.spdSetList.ActiveSheet.Rows[rowCount].Visible = false;
     }
     else if (DeleteTag == "1")
     {
      this.spdSetList.ActiveSheet.Rows[rowCount].Remove();
     }
    }
   }
  }

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jiezigege/archive/2009/08/26/4486642.aspx

posted @ 2010-12-08 23:03 也风 阅读(75) 评论(0) 编辑
 

前面已经讲过了WebBrowser的简单用法,下面依一个具体的应用实例来说明下WebBrowser:

这个实例是以读取移动交费中间商连连的交费页面进行自动交费的应用,其整体思路是从已有的数据库中读取数据做为交费信息连续像移动官方提交数据:

一、首先在winform窗体中拖入WebBrowser控件命名为webPage并设置其屏蔽js脚本错误的属性。在load事件中:

this.webPage.Navigate("连连官方交费网址");

这样当页面打开我们就进入了连连官方交费网站的登录页面。输入用户信息和密码,相关的验证信息即可进入个人页面。

二、加入一个按钮当我们单击这个按钮时就开始程序进行交费,这个过程我用了一个时间线程控件命名为timer1.其单击事件代码:

代码 
if (tsbtnstart.Text == "开始")
{
timer1.Enabled = true;
t2 = true;
tsbtnstart.Text = "停止";
t11 = true;
}
else
{
timer1.Enabled = false;
tsbtnstart.Text = "开始";
t2 = false;
t11 = false;
}

其中t2,t11分别为两个bool变量做为timer1是否开启的标识,下面会用到,这里不再多说。现在timer1已经开始读取数据,下面是timer1执行的事件:

代码 
private void timer1_Tick(object sender, EventArgs e)
{
try
{
//如果timer2正在运行
while (timer2.Enabled)
{
System.Threading.Thread.Sleep(500);
};
}
catch (Exception)
{

}
//充值提交运行结果
string state = "";
//数据库信息
string orderstr = "";

try
{
//从数据库中读取充值信息,并完成扣费,将其状态改为正在充值,并返回该条信息的编号,号码,金额用"_"隔开
orderstr = ifiobj.goulstrll(str1);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
//如果数据不为空
if (orderstr != "")
{
//将结果截取成数组
string[] strorder = orderstr.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries);
if (strorder.Length == 3)
{
//编号
ormid = strorder[0].ToString();
//号码
ormnum = strorder[1].ToString();
//金额
ormmoney = strorder[2].ToString();
}
//如果没有数据
if (ormid == "0" && ormnum == "0")
{
return;
}
//如果提交该条数据的用户余额不足
else if (ormid == "0" && ormnum == "1")
{
return;
}
else
{
//调用远程页面提交数据充值
state = submittoweb(ormid, ormnum, ormmoney);
//如果返回结果为over则中断程序

if (state == "over")
{
timer1.Enabled = false;
t2 = false;
t22 = false;
MessageBox.Show("号码:" + ormnum + "充值:" + ormmoney + "元失败,由于已经提前扣费,系统已经终止运行,请对提交该业务的营业厅进行返账操作后,点击确定继续运行。", "错误提示!", MessageBoxButtons.OK, MessageBoxIcon.Error);
timer1.Enabled = true;
t2 = true;
t22 = true;
return;
}
else if (state == "continue")
{
//timer2开启,timer2关闭
islock = 1;
timer1.Enabled = false;
t22 = true;
t11 = false;
timer2.Enabled = true;
}

else
{
databind(ormid, ormnum, ormmoney, "充值失败", 0);
return;
}
//}
}
}
}

这段代码中出现了timer2时间控件当timer1已经成功提交了一笔交费信息时关闭它,并同时打开timer2对页面进行不间断的读取当获得成功反馈信息时将timer1提交的数据记录为成功否则失败。其中的t22和t11一样是用来标识timer2的。下面是对提取的数据进行网页提交submittoweb函数:

代码 
private string submittoweb(string ormid1,string ormnum1, string ormmoney1)
{
try
{
//页面元素读取,读取框架tabWin中的内容
HtmlDocument doc = webPage.Document.Window.Frames["tabWin"].Document;
//用户号码
HtmlElement usernum = doc.All["custsimno"];
//重复输入
HtmlElement usernum1 = doc.All["custsimno1"];
//充值金额
HtmlElement usermoney = doc.All["pay"];
//代理商密码
HtmlElement userpwd = doc.All["agtpwd"];
//提交按钮
HtmlElement formbtn = doc.All["confirm"];
if (usernum == null || usermoney == null || formbtn == null || usernum1 == null || userpwd == null)
{
//如果页面读取出错
databind(ormid, ormnum, ormmoney, "连连充值失败提交冲正", 0);
return "continue";
}
//对页面内容进行赋值
usernum.SetAttribute("value", ormnum);
usernum1.SetAttribute("value", ormnum);
usermoney.SetAttribute("value", ormmoney);
userpwd.SetAttribute("value", str);
//执行提交按钮
formbtn.InvokeMember("click");
//执行js代码
doc.InvokeScript("SubmitbtnSave");
}
catch 
{

}
return "continue";
}

这段代码就不用多讲了接着timer1的事件,当执行完上面这段代码后如果顺利完成就返回:continue字符从面启动timer2关闭timer1否则返回over结束timer1等待人式处理

下面是timer2的事件代码:

代码 
private void timer2_Tick(object sender, EventArgs e)
{
//如果timer1正在运行
if (timer1.Enabled)
{
//timer2.Enabled = false;
return;
}
string innerText = "";
try
{
//获取页面集合
HtmlDocument doc = webPage.Document.Window.Frames["tabWin"].Document;
//读取页面form中的内容
innerText = doc.GetElementById("frmEdit").InnerText;
}
catch 
{

throw;
}
//对读取出的内容进行截取
string[] strorder = innerText.Split(new string[] { "用户姓名", "充值金额", "代理钱包余额", "冻结钱包余额" }, StringSplitOptions.RemoveEmptyEntries);

if (strorder.Length <5)
{
return;
}
else
{
strorder[4].Replace(" ", "");
//如果剩余金额不为空
if (strorder[4].ToString() != "\r\n")
{
strorder[2].Replace("\r\n", "");
strorder[2].Replace(" ", "");
strorder[4].Replace(" ", "");
if (strorder[4].ToString() == "\r\n"||strorder[2].ToString()=="")
return;
if (allmoney !=strorder[4].ToString())
{
strorder[4].Replace("\r\n", "");

strorder[4].Replace(",", "");
strorder[4].Replace(",", "");

//记录下用户名和金额
allmoney = strorder[4].ToString();
username = strorder[2].ToString();
//交易计数
nums++;
//进行数据记录,显示在listview中
databind(ormid, ormnum, ormmoney, "充值成功", 1);
//timer2关闭
timer2.Enabled = false;
//timer2关闭
//islock = 0;
t22 = false;
t11 = true;
timer1.Enabled = true;
}
else
return;
}
else
return;
}
}

这样整体的流程就完成了,可是当我们人工提交充值信息成功时官方会从服务器返回一个js的成功提示框,这样整个程序将被终止,如何处理,在网上看了好多例子结果没有合适的,就自己试了一下,着手点还是webBrowser控件的两个事件不再多说,前面已经讲过:

代码 
private void webPage_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
//屏蔽js窗体
if (islock==1)
{
try
{
HtmlDocument doc = webPage.Document.Window.Frames["tabWin"].Document;
IHTMLWindow2 win = (IHTMLWindow2)doc.Window.DomWindow;
string s = "function alert() {return '';}";
win.execScript(s, "javascript");
}
catch 
{

}

}

count++;
}

代码 
private void webPage_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (webPage.ReadyState < WebBrowserReadyState.Complete)
return;
////屏蔽js窗体
if (webPage.DocumentText.IndexOf("window.open(") > -1 || webPage.DocumentText.IndexOf("window.close()") > -1)
{
webPage.DocumentText = webPage.DocumentText.Replace("window.open(", "window.external.open(").Replace("window.close()", "window.external.close()");
}
try
{
HtmlDocument doc = webPage.Document.Window.Frames["tabWin"].Document;
IHTMLWindow2 win = (IHTMLWindow2)doc.Window.DomWindow;
string s = "function confirm() {";
s += "return true;";
s += "}";
s += "function alert(str) {return '';}";
win.execScript(s, "javascript");
string s1 = "window.alert = null;\r\nwindow.confirm = null;\r\nwindow.open = null;\r\nwindow.showModalDialog = null;";
win.execScript(s1, "javascript");
}
catch 
{

throw;
}

count--;
//判断页面是否加载完成count=0
if (count == 0 && t2)
{
//开启timer进行数据库信息读取
if (t11)
{
if (timer1.Enabled && timer2.Enabled)
timer2.Enabled = false;
else if (timer1.Enabled == false && timer2.Enabled == false)
{
timer1.Enabled = true;
}
else
{
timer1.Enabled = true;
}
}
//开启timer2进行页面信息读取
else if (t22)
{
if (timer1.Enabled && timer2.Enabled)
timer1.Enabled = false;
else if (timer1.Enabled == false && timer2.Enabled == false)
{
timer2.Enabled = true;
}
else
{
timer2.Enabled = true;
}
}
else
{

}
}
}这两段代码中有些冗余,没有清除,如果需要可以自己试着清除。

完整代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using mshtml;

namespace Demo
{
public partial class ForthForm : Form
{
llifi.Service1SoapClient ifiobj = new Demo.llifi.Service1SoapClient();
//验证
private string str1 = "*******";
//代理密码
private string str = "******";
//如果交费成功屏蔽js标识
private int islock = 0;
//账户余额
private string allmoney = "\r\n";
//充值用户
private string username = "";
//交易数量
private int nums = 0;
//页面刷新完成标识
private int count = 0;
//timer1标识
private bool t11 = false;
//程序是否开启标识
private bool t2 = true;
//timer2标识
private bool t22 = false;
//交易编号
private string ormid = "";
//交易号码
private string ormnum = "";
//交易金额
private string ormmoney = "";
public ForthForm()
{
InitializeComponent();

}

private void tsbtnNavigate_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(this.tscboURL.Text))
{
MessageBox.Show("No URL was checked!");
return;
}
else if (this.tscboURL.Text == "河南连连科技")
{
this.webPage.Navigate("l连连网");
tsbtnstart.Enabled = true;
}
else
{

}
}

private void toolStripButton1_Click(object sender, EventArgs e)
{
if (tsbtnstart.Text == "开始")
{
timer1.Enabled = true;
t2 = true;
tsbtnstart.Text = "停止";
t11 = true;
}
else
{
timer1.Enabled = false;
tsbtnstart.Text = "开始";
t2 = false;
t11 = false;
}
}

private void timer1_Tick(object sender, EventArgs e)
{
try
{
//如果timer2正在运行
while (timer2.Enabled)
{
System.Threading.Thread.Sleep(500);
};
}
catch (Exception)
{

}
//充值提交运行结果
string state = "";
//数据库信息
string orderstr = "";

try
{
//从数据库中读取充值信息,并完成扣费,将其状态改为正在充值,并返回该条信息的编号,号码,金额用"_"隔开
orderstr = ifiobj.goulstrll(str1);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
//如果数据不为空
if (orderstr != "")
{
//将结果截取成数组
string[] strorder = orderstr.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries);
if (strorder.Length == 3)
{
//编号
ormid = strorder[0].ToString();
//号码
ormnum = strorder[1].ToString();
//金额
ormmoney = strorder[2].ToString();
}
//如果没有数据
if (ormid == "0" && ormnum == "0")
{
return;
}
//如果提交该条数据的用户余额不足
else if (ormid == "0" && ormnum == "1")
{
return;
}
else
{
//调用远程页面提交数据充值
state = submittoweb(ormid, ormnum, ormmoney);
//如果返回结果为over则中断程序

if (state == "over")
{
timer1.Enabled = false;
t2 = false;
t22 = false;
MessageBox.Show("号码:" + ormnum + "充值:" + ormmoney + "元失败,由于已经提前扣费,系统已经终止运行,请对提交该业务的营业厅进行返账操作后,点击确定继续运行。", "错误提示!", MessageBoxButtons.OK, MessageBoxIcon.Error);
timer1.Enabled = true;
t2 = true;
t22 = true;
return;
}
else if (state == "continue")
{
//timer2开启,timer2关闭
islock = 1;
timer1.Enabled = false;
t22 = true;
t11 = false;
timer2.Enabled = true;
}

else
{
databind(ormid, ormnum, ormmoney, "充值失败", 0);
return;
}
//}
}
}
}
private string submittoweb(string ormid1,string ormnum1, string ormmoney1)
{
try
{
//页面元素读取,读取框架tabWin中的内容
HtmlDocument doc = webPage.Document.Window.Frames["tabWin"].Document;
//用户号码
HtmlElement usernum = doc.All["custsimno"];
//重复输入
HtmlElement usernum1 = doc.All["custsimno1"];
//充值金额
HtmlElement usermoney = doc.All["pay"];
//代理商密码
HtmlElement userpwd = doc.All["agtpwd"];
//提交按钮
HtmlElement formbtn = doc.All["confirm"];
if (usernum == null || usermoney == null || formbtn == null || usernum1 == null || userpwd == null)
{
//如果页面读取出错
databind(ormid, ormnum, ormmoney, "连连充值失败提交冲正", 0);
return "continue";
}
//对页面内容进行赋值
usernum.SetAttribute("value", ormnum);
usernum1.SetAttribute("value", ormnum);
usermoney.SetAttribute("value", ormmoney);
userpwd.SetAttribute("value", str);
//执行提交按钮
formbtn.InvokeMember("click");
//执行js代码
doc.InvokeScript("SubmitbtnSave");
}
catch 
{

}
return "continue";
}

private void timer2_Tick(object sender, EventArgs e)
{
//如果timer1正在运行
if (timer1.Enabled)
{
//timer2.Enabled = false;
return;
}
string innerText = "";
try
{
//获取页面集合
HtmlDocument doc = webPage.Document.Window.Frames["tabWin"].Document;
//读取页面form中的内容
innerText = doc.GetElementById("frmEdit").InnerText;
}
catch 
{

throw;
}
//对读取出的内容进行截取
string[] strorder = innerText.Split(new string[] { "用户姓名", "充值金额", "代理钱包余额", "冻结钱包余额" }, StringSplitOptions.RemoveEmptyEntries);

if (strorder.Length <5)
{
return;
}
else
{
strorder[4].Replace(" ", "");
//如果剩余金额不为空
if (strorder[4].ToString() != "\r\n")
{
strorder[2].Replace("\r\n", "");
strorder[2].Replace(" ", "");
strorder[4].Replace(" ", "");
if (strorder[4].ToString() == "\r\n"||strorder[2].ToString()=="")
return;
if (allmoney !=strorder[4].ToString())
{
strorder[4].Replace("\r\n", "");

strorder[4].Replace(",", "");
strorder[4].Replace(",", "");

//记录下用户名和金额
allmoney = strorder[4].ToString();
username = strorder[2].ToString();
//交易计数
nums++;
//进行数据记录,显示在listview中
databind(ormid, ormnum, ormmoney, "充值成功", 1);
//timer2关闭
timer2.Enabled = false;
//timer2关闭
//islock = 0;
t22 = false;
t11 = true;
timer1.Enabled = true;
}
else
return;
}
else
return;
}
}

private void webPage_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (webPage.ReadyState < WebBrowserReadyState.Complete)
return;
////屏蔽js窗体
if (webPage.DocumentText.IndexOf("window.open(") > -1 || webPage.DocumentText.IndexOf("window.close()") > -1)
{
webPage.DocumentText = webPage.DocumentText.Replace("window.open(", "window.external.open(").Replace("window.close()", "window.external.close()");
}
try
{
HtmlDocument doc = webPage.Document.Window.Frames["tabWin"].Document;
IHTMLWindow2 win = (IHTMLWindow2)doc.Window.DomWindow;
string s = "function confirm() {";
s += "return true;";
s += "}";
s += "function alert(str) {return '';}";
win.execScript(s, "javascript");
string s1 = "window.alert = null;\r\nwindow.confirm = null;\r\nwindow.open = null;\r\nwindow.showModalDialog = null;";
win.execScript(s1, "javascript");
}
catch 
{

throw;
}

count--;
//判断页面是否加载完成count=0
if (count == 0 && t2)
{
//开启timer进行数据库信息读取
if (t11)
{
if (timer1.Enabled && timer2.Enabled)
timer2.Enabled = false;
else if (timer1.Enabled == false && timer2.Enabled == false)
{
timer1.Enabled = true;
}
else
{
timer1.Enabled = true;
}
}
//开启timer2进行页面信息读取
else if (t22)
{
if (timer1.Enabled && timer2.Enabled)
timer1.Enabled = false;
else if (timer1.Enabled == false && timer2.Enabled == false)
{
timer2.Enabled = true;
}
else
{
timer2.Enabled = true;
}
}
else
{

}
}
}

private void webPage_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
//屏蔽js窗体
if (islock==1)
{
try
{
HtmlDocument doc = webPage.Document.Window.Frames["tabWin"].Document;
IHTMLWindow2 win = (IHTMLWindow2)doc.Window.DomWindow;
string s = "function alert() {return '';}";
win.execScript(s, "javascript");
}
catch 
{

}

}

count++;
}
/// <summary>
/// 连连充值数据信息状态更新
/// </summary>
/// <param name="ormd"> 信息编号</param>
/// <param name="ormn">号码</param>
/// <param name="ormoney">金额</param>
/// <param name="state">状态</param>
/// <param name="n">状态标识,1成功,0失败</param>
private void databind(string ormd, string ormn, string ormoney, string state, int n)
{
int id = 0;
try
{
id = ifiobj.SetOrderMobileStatell(str1, Convert.ToInt32(ormd), n, "连连交费" + state);
}
catch 
{

}
if (id == 1)
{
ListViewItem[] listViewItem = new ListViewItem[1];
listViewItem[0] = new ListViewItem(new string[] { ormd, ormn, ormoney + "元", state });
lvorder.Items.AddRange(listViewItem);
////开启timer1标识
//t11 = true;
//timer1.Enabled = true;
return;
}
else
{
t2 = false;
timer1.Enabled = false;
MessageBox.Show("编号为:" + ormid + "的交易" + state + "\r\n信息记录失败,程序已经终止,请记录该信息,单击确定继续程序", "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
t2 = true;
timer1.Enabled = true;
}
}
private void ForthForm_Load(object sender, EventArgs e)
{
tsbtnstart.Enabled = false;
lvorder.Columns.Add("编号", 40);
lvorder.Columns.Add("号码", 80);
lvorder.Columns.Add("充值金额", 80);
lvorder.Columns.Add("状态", 120);
lvorder.GridLines = true; //显示表格线
lvorder.View = View.Details;//显示表格细节
lvorder.HeaderStyle = ColumnHeaderStyle.Clickable;//对表头进行设置
lvorder.FullRowSelect = true;//是否可以选择行
}

}
}

posted @ 2010-12-08 11:24 也风 阅读(113) 评论(1) 编辑
 

这不是一个新问题,网上讨论此问题的帖子不少,说什么的都有,今天做个总结。
当我们使用WebBrowser控件时弹出错误信息框,而且会让一些自动执行的程序暂停,如何禁用呢?

WebBrowser控件ScriptErrorsSuppressed 设置为True,可禁止弹出脚本错误对话框,ScriptErrorsSuppressed属性是对其基础COM控件的Silent属性的封装,因此设置ScriptErrorsSuppressed属性和设置其基础COM控件的Slient属性是效果一样的,这一点通过反编译System.Windows.Forms程序集可以证实。

为了解决这个问题,有的人专门从WebBrowser派生出一个新类,然后重写了AttachInterfaces方法,其实也是没有必要的,效果和直接设置ScriptErrorsSuppressed属性相同。

不过要注意的是:
ScriptErrorsSuppressed 设置为True会禁用所有的对话框,比如提示Activex下载、执行以及安全登录等对话框。
如果不想禁止除脚本错误之外的对话框,请使用MSDN上的代码示例:

private void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    ((WebBrowser)sender).Document.Window.Error += new HtmlElementErrorEventHandler(Window_Error);
}

private void Window_Error(object sender, HtmlElementErrorEventArgs e)
{
    // Ignore the error and suppress the error dialog box. 
    e.Handled = true;
}

posted @ 2010-12-08 11:23 也风 阅读(89) 评论(0) 编辑
   2010年12月6日

一、屏蔽alert、confirm、showModalDialog源代码:

例1、先引用COM组建mshtml;

引用名称空间mshtml:

using mshtml;

然后处理WebBrowser控件的Navigated事件,代码如下:

  1. private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
  2. {
  3. IHTMLWindow2 win = (IHTMLWindow2)webBrowser1.Document.Window.DomWindow;
  4. string s = "window.alert = null;\r\nwindow.confirm = null;\r\nwindow.open = null;\r\nwindow.showModalDialog = null;";
  5. win.execScript(s, "javascript");
  6. }

private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e) { IHTMLWindow2 win = (IHTMLWindow2)webBrowser1.Document.Window.DomWindow; string s = "window.alert = null;\r\nwindow.confirm = null;\r\nwindow.open = null;\r\nwindow.showModalDialog = null;"; win.execScript(s, "JavaScript"); }

例2、

我们在使用WebBrowser得到网页代码模拟操作的时候,常常会因为目标网页有弹出对话框(alert、confirm)而中断我们操作,网上也有关于屏蔽这些对话框的介绍,比如另开一线程来定时确定,或是采用FindWindow等方法来进行关闭对话框,但这些办法给人感觉总有点烦琐;其实我们只要在目标网页中重载alert和confirm函数,让它们一直都返回true,那就ok拉,下面我们来说说在.net2.0中如何实现:

该办法要用到IHTMLWindow2类,所以我们要先添加一个引用:在项目引用里面选择COM选项卡,添加Microsoft HTML Object Library,然后在我们的cs文件中引如名称空间:mshtml;

然后取得我们目标页面的HtmlDocument,比如:
HtmlDocument hd = webBrowser1.Document.Window.Frames[0].Document;

接着进行最重要的一步,重载alert,confirm函数:
IHTMLWindow2 win = (IHTMLWindow2)hd.Window.DomWindow;
string s = @"function confirm() {";
s += @"return true;";
s += @"}";
s += @"function alert() {}";
win.execScript(s, "javascript");

OK ,大功告成,我们可以继续我们正常的操作拉,比如填写表单并提交:

hd.All["username"].SetAttribute("value","username");
hd.All["password"].SetAttribute("value","password");
hd.All["buttom"].InvokeMember("click");

运行一下,烦人的alert和confirm总算不见了

二、关闭调试对话框:

处理webbrowser的NewWindow事件,设定其传入的参数Cancel=false即可。

 

为了您的安全,请只打开来源可靠的网址

打开网站    取消

来自: http://hi.baidu.com/fangqm/blog/item/2906a134fc718dbbd1a2d326.html

posted @ 2010-12-06 14:15 也风 阅读(100) 评论(0) 编辑
   2010年12月3日
网页表单自动填写实现原理
曾今向网友介绍过我的一个自己编写的自动填写网页表单的小程序,很多网友都觉得很实用,也许多会对这个程序的源码很感兴趣,这里我只是简介下程序中用到的主要代码。最初我是通过下面这篇文章渐渐积累的相关知识,再慢慢完善,现转来同大家分享,共同学习。

话说有了WebBrowser类,终于不用自己手动封装SHDocVw的 AxWebBrowser这个ActiveX控件了。这个类如果仅仅作为一个和IE一模一样浏览器,那就太没意思了(还不如直接用IE呢)。那么,无论我们是想做一个“定制版IE”,还是希望利用HTML来做用户界面(指WinApp而非WebApp。许多单机软件,包括Windows的帮助支持中心,都是HTML做的),都少不了Windows Form和包含在WebBrowser中的Web页面的交互。本文将通过几个实际的例子,初步介绍一下WinForm和WebBrowser所包含的 Web页面之间的交互。

下面的代码假设你已经建立了一个Windows Form,上面有一个WebBrowser名为“webBrowser”。

Study Case 1:用WinForm的Event Handler响应Web页面的事件

现在有这样一个Windows Application,它的界面上只有一个WebBrowser,显示一个本地的HTML文件作为界面。现在的问题是,所有逻辑都可以放在HTML文件里,唯独“关闭”按钮遇到了困难——通常,Web页面是没有办法直接控制浏览器的,更不用说结束这个WinForm程序了。

但是,在.Net 2.0当中,“由Windows Form响应Web页面的事件”已经成为了现实。

在.Net 2.0中,整个HTML文档以及其包含的各个HTML元素,都和一个个HtmlDocument、HtmlElement之类的.Net对象对应。因此只要找到这个“关闭”按钮对应的HtmlElement对象,为其click事件添加Event Handler即可。
假设HTML源代码如下:

HTML code
<html>
<body>
<input type="button" id="btnClose" value="关闭" />
</body>
</html>

那么找出该按钮并为之添加Event Handler的代码如下:

C# code
HtmlDocument htmlDoc = webBrowser.Document;
HtmlElement btnElement = htmlDoc.All["btnClose"];
if (btnElement != null)
{
btnElement.click += new HtmlElementEventHandler(HtmlBtnClose_Click);
}

其中 HtmlBtnClose_Click是按下Web按钮时的Event Handler。

很简单吧?那么稍稍高级一点的——我们都知道一个HTML元素可能有很多各种各样的事件,而HtmlElement这个类只给出最常用、共通的几个。那么,如何响应其他事件呢?这也很简单,只需要调用HtmlElement的AttachEventHandler就可以了:

C# code
btnElement.AttachEventHandler("onclick", new EventHandler(HtmlBtnClose_Click));
//这一句等价于上面的 btnElement.click += new HtmlElementEventHandler(HtmlBtnClose_Click);

对于其他事件,把"onclick"换成该事件的名字就可以了。例如:

C# code
formElement.AttachEventHandler("onsubmit", new EventHandler(HtmlForm_Submit));

Study Case 2:表单(form)的自动填写和提交
要使我们的WebBrowser具有自动填表、甚至自动提交的功能,并不困难。

假设有一个最简单的登录页面,输入用户名密码,点“登录”按钮即可登录。已知用户名输入框的id(或Name,下同)是username,密码输入框的id是password,“登录”按钮的id是submitbutton,那么我们只需要在webBrowser的 DocumentCompleted事件中使用下面的代码即可:

C# code
HtmlElement btnSubmit = webBrowser.Document.All["submitbutton"];
HtmlElement tbUserid = webBrowser.Document.All["username"];
HtmlElement tbPasswd = webBrowser.Document.All["password"];
if (tbUserid == null || tbPasswd == null || btnSubmit == null)
return;
tbUserid.SetAttribute("value", "smalldust");
tbPasswd.SetAttribute("value", "12345678");
btnSubmit.InvokeMember("click");

这里我们用SetAttribute来设置文本框的“value”属性,用InvokeMember来调用了按钮的“click”方法。因为不同的Html元素,其拥有的属性和方法也不尽相同,所以.Net 2.0提供了统一的HtmlElement来概括各种Html元素的同时,提供了这两个方法以调用元素特有的功能。关于各种Html元素的属性和方法一览,可以查阅MSDN的DHTML Reference。

※关于表单的提交,的确还有另一种方法就是获取form元素而不是button,并用form元素的 submit方法:

C# code
HtmlElement formLogin = webBrowser.Document.Forms["loginForm"];
//……
formLogin.InvokeMember("submit");

本文之所以没有推荐这种方法,是因为现在的网页,很多都在submit按钮上添加onclick事件,以对提交的内容做最基本的验证。如果直接使用form的submit方法,这些验证代码就得不到执行,有可能会引起错误。

posted @ 2010-12-03 17:02 也风 阅读(280) 评论(0) 编辑
   2010年12月2日
摘要: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace WindowsFormsApplication1{ public...阅读全文
posted @ 2010-12-02 13:58 也风 阅读(53) 评论(0) 编辑
 
摘要: WebBrowser控件禁用超链接转向、脚本错误提示、默认右键菜单和快捷键从 VS2005开始,VS自带的 WebBrowser控件,就已经相当友好了,可控性非常高了。Winform 结合 WebBrowser 做UI开发,也是一种非常流畅的模式了, 微软的VS IDE 系列的安装程序, 基本都是这个模式的 禁用错误脚本提示将 WebBrowser控件的 ScriptErrorsSuppresse...阅读全文
posted @ 2010-12-02 13:41 也风 阅读(76) 评论(0) 编辑
Powered by: 
博客园 
Copyright ©2011 也风

c# WebBrowser开发参考资料--杂七杂八的更多相关文章

  1. c# WebBrowser开发参考资料

    原文:c# WebBrowser开发参考资料 c# WebBrowser开发参考资料,所有资料的采集均来自网上 话说有了WebBrowser类,终于不用自己手动封装SHDocVw的AxWebBrows ...

  2. Lua游戏开发参考资料收集

    table {border-collapse:collapse;} List of game engines that use lua: 2D Agen (Lua; Windows) Blitwiza ...

  3. 嵌入式linux开发:杂七杂八的话

    1. 编译器:常用的有Sourcery,linaro等.当然芯片厂家一般也会提供可用的编译器. 2. 将配置和编译时的输出O到其他位置:make O=some_dir 这样做的好处是保持源代码树的干净 ...

  4. 微信小程序开发参考资料汇总

    不错的微信小程序入门教程:微信小程序入门二: 条件.遍历.网络请求.获取本地图片http://blog.csdn.net/lecepin/article/details/54016701 微信小程序入 ...

  5. UHF RFID,高频RFID开发参考资料

    ISO18000-6C电子标签百科  http://baike.baidu.com/item/ISO18000-6C%E7%94%B5%E5%AD%90%E6%A0%87%E7%AD%BE/80500 ...

  6. Android开发参考资料

    Android入门第九篇之AlertDialog: http://blog.csdn.net/hellogv/article/details/5955959 Android的AlertDialog详解 ...

  7. Windows Phone开发参考资料

    Windows Phone API 参考 http://msdn.microsoft.com/zh-cn/library/windows/apps/ff626516(v=vs.105).aspx Wi ...

  8. Dynamics CRM开发参考资料

    Developer Guide for Dynamics 365 Customer Engagement https://docs.microsoft.com/en-us/dynamics365/cu ...

  9. Cocos2d-x--开发参考资料

    1.CocoStudio使用指南 所用版本:CocoStudio v3.0.0 Cocos2d-x1.5b 自己网上查找并整理的一些资料,留下做个纪念,也希望对有需要的人有点帮助 链接地址:http: ...

随机推荐

  1. AWS的登录认证。。。

    Hello, I’m sorry for any concern regarding the $1.00 Authorization that you see associated with your ...

  2. 【转】vector中对象指针的排序

    原文:http://blog.csdn.net/tanlijun37/article/details/1948493 vector中对象指针的排序,初步想法是1: 把对象指针存到vector,重载bo ...

  3. python入门10 循环语句

    两种循环: 1 for in 2 while #coding:utf-8 #/usr/bin/python """ 2018-11-03 dinghanhua 循环语句 ...

  4. NO.006-2018.02.11《卜算子·我住长江头》宋代:李之仪

    卜算子·我住长江头_古诗文网(bǔ) 卜算子·我住长江头 宋代:李之仪 我住长江头,君住长江尾.日日思君不见君,共饮长江水. 我居住在长江上游,你居住在长江下游. 天天想念你却见不到你,共同喝着长江的 ...

  5. Android 回调的理解,觉得写得好就转过来。。。收藏一下

    转自:一个经典例子让你彻彻底底理解java回调机制 以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所 ...

  6. CF549BLooksery Party题解

    题目描述 The Looksery company, consisting of nn staff members, is planning another big party. Every empl ...

  7. POJ 3233 Matrix Power Series 【经典矩阵快速幂+二分】

    任意门:http://poj.org/problem?id=3233 Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K To ...

  8. canvas基本图形

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. JavaScript面向对象编程之创建对象

    参考资料依旧<JavaScript高级程序设计>,不得不说这本书写的太好了,讲的极为清晰凝练,好书! 先给出重点笔记,好好理解下面的三条笔记,每一句话都很重要: 1.实例的指针仅指向原型, ...

  10. 使用MVCPager做AJAX分页所走的弯路

    使用MVCPager做AJAX分页所需要注意的地方: 1.版本问题,推荐使用2.0以上,对ajax支持才比较的好了 2.当需要使用页索引输入或下拉框以及使用Ajax分页模式时,必须用Html.Regi ...