我正在使用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}" />
答案 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