我在一个窗体form2中添加了一个webBrowser控件,其中构造函数代码如下:public partial class browser : Form
    {
        public browser(string type,string url,string uid,string pwd)
        {
            InitializeComponent();
            this.StartPosition = FormStartPosition.CenterScreen;//居中
             webBrowser1.Navigate(url);
            //MessageBox.Show("1");//如果不注释这句话就没有异常
            try
            {
                HtmlElement element = webBrowser1.Document.GetElementById("LoginName");//这里会有异常
                element.InnerText = uid;
                element = webBrowser1.Document.GetElementById("password");
                element.InnerText = pwd;
                webBrowser1.Document.GetElementById("log_in").InvokeMember("Click");
            }catch(Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }
然后我在form1窗体调用它,也就是在form1中点击按钮后就弹出webBrowser,代码如下:        private void btwebmail_Click(object sender, EventArgs e)
        {
            browser webm = new browser("webmail", "http://webmail.stu.edu.cn", tbusername.Text, tbpwd.Text);
            webm.Show();
        }
结果是,如果我注释掉第一段代码中的“MessageBox.Show("1");”语句后,会产生以下异常:
---------------------------System.NullReferenceException: 未将对象引用设置到对象的实例。   在 autologin.browser..ctor(String type, String url, String uid, String pwd) 位置 D:\Backup\我的文档\Visual Studio 2008\Projects\autologin\browser.cs:行号 30
---------------------------为什么会这样子呢?我已经new了browser呀,怎么还会有异常,而且如果加上“MessageBox.Show("1");”就没有异常了。
请高手指教,谢谢!

解决方案 »

  1.   

    这是因为浏览器控件还没有将网页载入,而你就在获取网页上的元素进行操作,当然是空引用了
    这种办法是网络延迟造成的,得用DocumentCompleted事件可以解决这个问题
    DocumentCompleted是当WebBrowser控件全部加载完文档后发生,你的代码可以加在这个事件里
      

  2.   

    比如:
    //声明一个全局变量(网页是否加载完成)
    bool isLoad=false;
    //在DocumentCompleted事件中:
    webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {          
              isLoad=true;
            }在按钮事件中:
    private void btwebmail_Click(object sender, EventArgs e)
            {
               if(!isLoad)
                {
                  return;
                  MessageBox.Show("页面正在加载中,请稍候在试!");
                  return;
                }
                browser webm = new browser("webmail", "http://webmail.stu.edu.cn", tbusername.Text, tbpwd.Text);
                webm.Show();
            }
      

  3.   

    同意2楼及3楼,在操作Document对象前,先判断一下Webbrowser的IsBusy属性值
      

  4.   

    webBrowser1对象是否添加当前窗体
    载入是否成功
    while (webBrowser1.IsBusy) Application.DoEvents(); private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 

        if (webBrowser1.ReadyState < WebBrowserReadyState.Complete) return; 

    string LastUrl; 
    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 

    if (webBrowser1.ReadyState < WebBrowserReadyState.Complete || webBrowser1.Url.ToString() == LastUrl) return; 
    LastUrl = webBrowser1.Url.ToString(); 
      

  5.   

    在DocumentCompleted事件里进行操作