对象接收器事件循环自身 [英] Object receiver event looping on itself
本文介绍了对象接收器事件循环自身的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
if (searchSubmit == false )
{
webBrowser1.DocumentCompleted + =
new WebBrowserDocumentCompletedEventHandler(OnDocumentCompleted);
}
else
{
webBrowser1.Stop();
}
}
private void OnDocumentCompleted( object receiver,WebBrowserDocumentCompletedEventArgs e)
{
HtmlElementCollection avCollection = webBrowser1.Document.GetElementById( filterAvailability)。GetElementsByTagName( 选项跨度>);
列表< HtmlElement> avList = new 列表< HtmlElement>();
foreach (HtmlElement avItem in avCollection)
{
avList。加入(avItem);
}
HtmlElement avElement =
(HtmlElement)avList.Where(avOption = > avOption.GetAttribute(< span class =code-string> value)。等于( < span class =code-string> 1))。SingleOrDefault();
if (avElement.GetAttribute( value)。Equals( 1))
{
avElement.SetAttribute( Selected, 1);
avElement.InvokeMember( 点击);
}
bookCollection = webBrowser1.Document.GetElementsByTagName( button跨度>);
foreach (HtmlElement curElement in bookCollection)
{
if (curElement.GetAttribute( id) .Equals( searchSubmit))
{
curElement.InvokeMember(< span class =code-string> click);
}
}
searchSubmit = true ;
if (searchSubmit == true )
{
webBrowser1.Stop();
}
}
问题是即使我设置了bool变量,偶数也会循环。我注意到这一点,因为页面保持刷新,因为有searchSumbit Click调用成员。如何让代码只运行一次?
谢谢
添加了代码块 - OriginalGriff [/ edit]
解决方案
可能每次用户按下按钮时都不想添加新的处理程序,你现在似乎在做什么。
您是否意识到事件的+ =会为链添加处理程序?如果你在链中有相同的处理程序8次,每次事件被触发时它会被调用8次?
添加一次,或者在你不再需要它时删除它
if (searchSubmit == false)
{
webBrowser1.DocumentCompleted +=
new WebBrowserDocumentCompletedEventHandler(OnDocumentCompleted);
}
else
{
webBrowser1.Stop();
}
}
private void OnDocumentCompleted(object receiver, WebBrowserDocumentCompletedEventArgs e)
{
HtmlElementCollection avCollection = webBrowser1.Document.GetElementById("filterAvailability").GetElementsByTagName("option");
List<HtmlElement> avList = new List<HtmlElement>();
foreach(HtmlElement avItem in avCollection)
{
avList.Add(avItem);
}
HtmlElement avElement =
(HtmlElement)avList.Where(avOption => avOption.GetAttribute("value").Equals("1")).SingleOrDefault();
if (avElement.GetAttribute("value").Equals("1"))
{
avElement.SetAttribute("Selected", "1");
avElement.InvokeMember("click");
}
bookCollection = webBrowser1.Document.GetElementsByTagName("button");
foreach (HtmlElement curElement in bookCollection)
{
if (curElement.GetAttribute("id").Equals("searchSubmit"))
{
curElement.InvokeMember("click");
}
}
searchSubmit = true;
if (searchSubmit == true)
{
webBrowser1.Stop();
}
}
The problem is the even is looping all the time even if I set a bool variable. I noticed this because the page keeps refreshing since there is the searchSumbit Click invoke member. how do i make the code run only once?.
Thanks
[edit]Code block added - OriginalGriff[/edit]
解决方案
Probably, you don't want to add a new handler each time the user presses the button, as you appear to be doing now.
You do realize that "+=" for an event adds a handler to the chain? And that if you have the same handler in the chain 8 times, it will get called eight times every time the event is fired?
Add it once, or remove it when you don't need it anymore.
这篇关于对象接收器事件循环自身的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文