
#씨샵 #DocumentCompleted #1번만되도록 #왜이렇게많이되? #한번만되게만들어보자 #소스 #예제 #Event #웹브라우저
포스팅 목차 바로가기
안녕하세요, 배곧동개발자 입니다.
개인적으로 C# 을 가지고 놀 때에 가장 많이 건드는게 webBrowser 에요. 이 친구를 통해 페이지를 파씽하는 재미가 아주 쏠쏠하지요.
1. 문제점
그런데말입니다, webBrowser의 디폴트 이벤트인 documentCompleted는 해당 객체가 페이지 이동을 완료하는 일어나는 이벤트인데, 이게 하나의 페이지를 완료할 때에 몇번씩 일어나는 상황이 발생을 하게되요.
int cnt = 0;
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
cnt++;
MessageBox.Show(cnt.ToString());
}
private void button1_Click(object sender, EventArgs e)
{
cnt = 0;
webBrowser1.Navigate("https://yongtech.tistory.com/");
}
간단한 예시를 위해 위에처럼 코드를 작성하고 돌려보면

위 움짤에서 보시다시피 하나의 페이지를 띄우는데 18번이나 documentCompleted 이벤트가 발생하게 됩니다.
해당 페이지 내에 여러 객체들을 불러오면서 하나하나 끝날때 마다 이벤트가 발생하는건지, 아니면 뭐 때문인지 모르겠으나 나는 해당 페이지가 끝났을 때에 한번만 발생시키고 싶은데 이놈은 18번이나 발생이 되어버리니 참 골치가 아프지요.
2. 해결방법
예전에 연구실에서 개발할 때에 교수님이 이벤트 발생 주체인 sender와 webBrowser의 url이 동일한지 체크하거나 title이 동일한지 체크하는 로직을 넣으면 될거라고 하셨었는데, 그것도 정확한 해결은 안되었던걸로 기억해요.
자, 그래서 제가 나름의 해결책을 들고왔습니다.
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
{
cnt++;
MessageBox.Show(cnt.ToString());
}
}
위에 있는 코드처럼 DocumentCompleted 이벤트 내에 현재 웹브라우저의 상태가 완료인지 아닌지를 체크하는 IF문을 하나 넣어줘보면 어떻게될까요?

딱 한번만 돌아가지는 않지만, 제가 지금 개발하는 로직에서는 이정도만 되도 충분하므로 그냥 이렇게 써볼까해요.
3. 결론
몇가지 방법들을 찾아보고 적용해봤지만, 제가 찾은 최선책은 이거에요.
if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
혹시 다른 방법 아시는 분이 있으시다면 댓글 부탁드려요!
이만, 배곧동개발자 였습니다.