C# 对多个页面使用webbrowser

C# 对多个页面使用webbrowser,c#,sql-server,C#,Sql Server,我正在做一个项目。在我的mssql服务器上,我有很多URL,我需要检查我是否可以登录。以下是我目前的代码: public List<WebBrowser> myBrowsers = new List<WebBrowser>(); private void button3_Click(object sender, EventArgs e) { SqlConnection connection = new SqlConnect

我正在做一个项目。在我的mssql服务器上,我有很多URL,我需要检查我是否可以登录。以下是我目前的代码:

        public List<WebBrowser> myBrowsers = new List<WebBrowser>();

    private void button3_Click(object sender, EventArgs e)
    {
        SqlConnection connection = new SqlConnection(connectionString);
        connection.Open();
        SiteeeID = Convert.ToInt32(listBox1.SelectedValue);
        string url = "select http,username,pass,userID,passID,butonID from AyrintiSite where username!=''";
        DataTable dt = new DataTable();
        using (SqlConnection cn = new SqlConnection(connectionString))
        {
            using (SqlCommand cm = new SqlCommand(url, cn))
            {
                cn.Open();

                dt.Load(cm.ExecuteReader());

            }
        }

        for (int i = 0; i < dt.Rows.Count; i++)
        {
            WebBrowser browser = new WebBrowser();
            browser.DocumentCompleted += webBrowserDocumentCompleted;
            browser.Navigate(dt.Rows[i][0].ToString());
            myBrowsers.Add(browser);
        }
    }
    private void webBrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {

        if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath)
            return;

        WebBrowser browser = sender as WebBrowser;

        browser.Document.GetElementById("KullaniciAdiTextBox").SetAttribute("value", "username");
        browser.Document.GetElementById("SifreTextBox").SetAttribute("value", "pass");
        browser.Document.GetElementById("SistemeGirImageButton").InvokeMember("click");
        browser.DocumentCompleted -= webBrowserDocumentCompleted;
        browser.DocumentCompleted += webBrowserDestroyOnCompletion;
    }
    private void webBrowserDestroyOnCompletion(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath)
            return;

        if (e.Url.AbsolutePath.Contains("Login"))
        {
            //send e-mail
        }
        WebBrowser browser = sender as WebBrowser;
        browser.Dispose();
        myBrowsers.Remove(browser);

    }
public List myBrowsers=new List();
私有无效按钮3\u单击(对象发送者,事件参数e)
{
SqlConnection连接=新的SqlConnection(connectionString);
connection.Open();
siteeid=Convert.ToInt32(列表框1.SelectedValue);
string url=“从AyrintiSite中选择http、用户名、密码、用户ID、密码ID和butonID,其中用户名!=”;
DataTable dt=新的DataTable();
使用(SqlConnection cn=newsqlconnection(connectionString))
{
使用(SqlCommand cm=newsqlcommand(url,cn))
{
cn.Open();
dt.Load(cm.ExecuteReader());
}
}
对于(int i=0;i

现在我的数据表中有17页。其中10-12人可以正确登录,但其他人不能,我的程序会向我发送电子邮件。我在我的数据库里查了一千遍都没问题,他们都应该登录。我的代码有错误吗?

导航到DocumentCompleted事件中的下一个URL

声明pageIndex变量以将索引保留在dt.rows中:

 int pageIndex=0 ; 
将dt.rows上的循环替换为以下内容:

        WebBrowser browser = new WebBrowser();
        browser.DocumentCompleted += webBrowserDocumentCompleted;
        browser.Navigate(dt.Rows[pageIndex][0].ToString());
DocumentCompleted事件中dt.rows上的“循环”:

private void webBrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath) return;
    WebBrowser browser = sender as WebBrowser;
    browser.Document.GetElementById( "KullaniciAdiTextBox").SetAttribute("value", "username");
    browser.Document.GetElementById( "SifreTextBox").SetAttribute("value", "pass");
    browser.Document.GetElementById( "SistemeGirImageButton").InvokeMember("click");
    pageIndex++ ;
    If (pageIndex<dt.Rows.Count) browser.Navigate(dt.Rows[pageIndex][0].ToString());
  }
private void webBrowserDocumentCompleted已完成(对象发送方,WebBrowserDocumentCompletedEventArgs e)
{
if(e.Url.AbsolutePath!=(发件人为WebBrowser).Url.AbsolutePath)返回;
WebBrowser browser=发件人作为WebBrowser;
browser.Document.GetElementById(“KullaniciAdiTextBox”).SetAttribute(“值”、“用户名”);
browser.Document.GetElementById(“SifreTextBox”).SetAttribute(“value”、“pass”);
browser.Document.GetElementById(“SistemeGirImageButton”).InvokeMember(“单击”);
pageIndex++;

If(pageIndex may helpBefore Navigate()方法调用构造函数:webBrowser1=new WebBrowser();如果创建一个新的WebBrowser,您将丢失cookies。您的方法中存在一个问题,因为您没有在循环中等待文档完成事件。解决方案是执行Navigate()到第一个Url,而不是循环。然后,在DocumentCompleted事件中,执行一些操作并导航()到下一个Url。我用您的建议补充了我的问题。您可以再次检查吗?@jdwengt谢谢您,但我无法在DocumentCompleted事件中从datatable获取值。我如何才能做到这一点?将“datatable dt”声明为类似“MyBrowser”的表单变量(不要在按钮单击过程中重新声明)。