【问题标题】:winform webbrowser not replacedwinform webbrowser 没有被替换
【发布时间】:2013-08-08 04:39:20
【问题描述】:

从我的Form1 初始化一个类scraper。在scraper 类中有一个函数login。这个想法是,该类记录用户在网站上的登录,并返回网络浏览器,以便在Form1 中提供登录的网络浏览器控件。

到目前为止我已经得到了这个代码:Form1

private void button1_Click(object sender, EventArgs e)
{
    Scraper scraper = new Scraper(this);
    scraper.login(conf._webLogin);  
}

public void updateLoginWeb(WebBrowser web)
{
    webBrowser1 = web;
    MessageBox.Show("DONE");
}

conf 类:

public WebBrowser _webLogin = new WebBrowser();

刮板类:

private Form1 parent;

private WebBrowser _web_Login = new WebBrowser();


public Scraper()
{

}

public Scraper(Form1 parent)
    : this()
{
    this.parent = parent;
}

public void login(WebBrowser web)
{
    _web_Login = web;
    _web_Login.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(login_DocumentCompleted);
    _web_Login.Navigate("http://www.google.com/");
}

private void login_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    //This line is so you only do the event once   
    if (e.Url != _web_Login.Url)
        return;
    parent.updateLoginWeb(_web_Login);
}

我使用 google 作为测试,但没有任何效果(甚至不是另一个网站)。

问题是Form 中的网络浏览器没有更新。它仍然是一个白屏。

你们怎么看这个?你知道问题是什么,或者你们知道更好的方法来解决这个问题吗?

【问题讨论】:

  • 你有跨线程调用网络浏览器吗?
  • @user64,不。只是这 1 个被按钮触发的东西......
  • webbrowser 是否在 UI 线程上运行?网络浏览器使用代理吗?检查 google.com 是否显示在 IE 中
  • @user64,是的,它在 UI 线程中运行,不,浏览器不使用代理
  • @Shaeldon,如果您要基于clean up request 发布edit 帖子,请编辑整个 帖子。不要只删除几行。我拒绝并编辑了大量您建议的编辑。如果我看到它,我也会拒绝。

标签: c# winforms class browser webbrowser-control


【解决方案1】:

我认为你的问题是你不能简单地分配 webBrowser 变量:

webBrowser1 = web;

您正在更改 Form1.webBrower1 变量,但 Forms.Controls 集合仍指向原始 webBrowser 控件。

你不能只将 Form1.webBrower1 传递给 scraper.login 函数吗?:

private void button1_Click(object sender, EventArgs e)
{
    Scraper scraper = new Scraper(this);
    scraper.login(webBrowser1);  
}

public void updateLoginWeb(WebBrowser web)
{
    //webBrowser1 = web;  // you don't need this anymore
    MessageBox.Show("DONE");
}

如果您确实需要更换控件,可以执行以下操作:

public void updateLoginWeb(WebBrowser web)
{
    Controls.Remove(webBrowser1);
    Controls.Add(web);
    webBrowser1 = web;  // you don't need this anymore
    MessageBox.Show("DONE");
}

但您可能需要手动设置新的网络浏览器布局属性。

【讨论】:

  • 好吧,但是我如何让我工作的网络浏览器(登录和其他类似的东西)回到 Form1 显示。或者您是否知道 cookie 是共享的。这样当我登录时(它是基于 cookie 的),我也登录了任何其他 webbrowser 控件(即使我稍后创建了那个)
  • 你不能只使用一个 WebBrowser 控件吗? Form1.webBrowser1,并在刮板类中使用它?不要创建一个不同的
  • 嗯,问题是我最终可能会在 1 分钟内使用 webbrowser 做 2 件或更多的事情。所以我需要为每个任务多个...
  • 您不能在单个进程中隔离多个“会话”。 WinINET(以及 Web 浏览器控件)在整个进程范围内共享 cookie。
  • 是的,基本上它的行为就像您在 Internet Explorer 中打开一个新标签页一样。
猜你喜欢
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多