private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text != "")
{
String search = "";
String htmlSource = "";
String urlDetail = "";
search = "http://www.szcredit.com.cn/SZCredit/Query/frmQueryList.aspx?MC=[" + textBox1.Text + "]&Type=0";
htmlSource = Get_Http(@search, 30000);
urlDetail = SniffwebCode(htmlSource, "frmQueryMode.aspx?", "]");
urlDetail = "http://www.szcredit.com.cn/SZCredit/Query/frmQueryMode.aspx" + urlDetail + "]";
urlDetail = urlDetail.Replace("amp;", "");
webBrowser1.Navigate(urlDetail);
}
else
{
MessageBox.Show("请填写查询信息!");
}
HtmlElement elemButton = webBrowser1.Document.All.GetElementsByName("btnQuery")[0];
mshtml.HTMLInputElement button = (mshtml.HTMLInputElement)(elemButton.DomElement);
button.click();
}
}
}
代码如上(写得不好看,对付着看吧,呵呵)
在
HtmlElement elemButton = webBrowser1.Document.All.GetElementsByName("btnQuery")[0];
点击button1的时候,这段会出现“未将对象引用设置到对象的实例。”,使用new呢,HtmlElement 又不支持。辗转了好久都没能解决,于是逐行调试,偶然发现某一次居然通过了,于是我开始怀疑根本不是代码的使用错误。
仔细观察了那一次正确的调试过程,发现了一个问题,我在代码段之间加入了一些弹出对话框的代码,以显示出变量和控件的状态,导致程序运行的过程被拉长了。
我猛然想到:该不会是因为WebBrowser在Navigate之后还没有加载完,我就运行导致的吧……
于是做了如下更改
while (1 == 1)
{
MessageBox.Show(webBrowser1.ReadyState.ToString());
if (webBrowser1.ReadyState.ToString() == "Complete")
{
HtmlElement elemButton = webBrowser1.Document.All.GetElementsByName("btnQuery")[0];
mshtml.HTMLInputElement button = (mshtml.HTMLInputElement)(elemButton.DomElement);
button.click();
break;
}
}
当webBrowser1.ReadyState显示为“Complete”的时候,再执行模拟点击按钮的过程,果然就再没出现“未将对象引用设置到对象的实例。”的错误。
看来,往往是因为没有完全加载或者尚未完全运行完过程才是导致“未将对象引用设置到对象的实例。”的主要原因吧。