将委托附加到webBrowser html元素

时间:2012-07-25 14:31:56

标签: c# winforms user-controls lambda

我正在使用Windows窗体UserControl来使用webBrowser控件呈现某些HTML并与之交互。部分内容是一些单选按钮,我需要从我的控件中捕获单击事件。因此,在webBrowser的DocumentCompleted事件中,我将onClick事件附加到单选按钮。所有这一切似乎都工作,直到我点击其中一个单选按钮,似乎只有最后一个单选按钮实际上附加了事件,即使我已经逐步完成代码并为每个单选按钮附加委托。

这是我用来将委托附加到HtmlElement的lambda。

void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
     foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("input"))
     {
         el.AttachEventHandler("onclick", (sender1, e1) => clickEventHandler(el, EventArgs.Empty));
     }
}

public void clickEventHandler(object sender, EventArgs e)
{
    Guid answerId;
    var he = (HtmlElement)sender;
    if (Guid.TryParse(he.Id, out answerId))
        if (AnswerSelected != null)
            AnswerSelected(answerId);
 }

AnswerSelected的委托和事件

public delegate void HtmlControlAnswerEventHandler(Guid answerId);
public event HtmlControlAnswerEventHandler AnswerSelected;

输入按钮字符串。

<input type=radio id="{0}" name="answer" value="{1}" />

2 个答案:

答案 0 :(得分:0)

似乎在使用像这样的lambdas时,用于引用该对象的变量将丢失。如果我以这种方式附加事件

void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
     foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("input"))
     {
         el.AttachEventHandler("onclick", (sender1, e1) => clickEventHandler(el, EventArgs.Empty));
     }
}

然后只有最后一个附加的事件有效。

当我以这种方式附加事件时

private void AttachClickEventToInputs()
{
      var htmlElements = webBrowser1.Document.GetElementsByTagName("input");
      for (int i = 0; i < htmlElements.Count; i++)
      {
          htmlElements[i].AttachEventHandler("onclick", (sender1, e1) => clickEventHandler(htmlElements[i], EventArgs.Empty));
      }
 }

inder有一个问题我变得比元素的数量更多(这让我感到困惑。)

但是,如果我以这种方式附加事件

private void AttachClickEventToInputs()
{
     var htmlElements = webBrowser1.Document.GetElementsByTagName("input");
     for (int i = 0; i < htmlElements.Count; i++)
     {
          HtmlElement el = htmlElements[i];
          el.AttachEventHandler("onclick", (sender1, e1) => clickEventHandler(el, EventArgs.Empty));
     }
}

然后一切都按预期工作。我并不完全确定为什么这样做有效,除此之外我们可能需要在附加委托时对该对象进行硬引用?

答案 1 :(得分:0)

String word = txt_search.getText(); String sql = "SELECT * FROM table WHERE colKeywords LIKE '%word%'"; 变量范围的问题。在评估委托时,循环已完成,el保存最后一个列表项的值。您可以通过将el分配给循环中的变量来解决此问题。

el