对象接收器事件循环自身 [英] Object receiver event looping on itself

查看:83
本文介绍了对象接收器事件循环自身的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆