[C#] WebBrowser 컨트롤에 모든 Frame이 다운로드 되었을 때를 판단하는 방법
http://chaoskcuf.com/entry/C-텍스트-파일에서-원하는-줄만-가져오기#comment3076 질문에 대한 답변입니다.
프레임으로 구성된 html 페이지인 경우에 WebBrowser의 DocumentCompleted 이벤트은 프레임 개수만큼 일어나게 됩니다.
그래서 아래에 질문하신 내용처럼 원하는 페이지가 로드되었는지 알기는 약간 성가시게 되어있습니다.
=======================================================================================
닷넷 2003쓰인 소스를 참고하여 2005에 적용하려고 하는데요
아래처럼 수정을 해보려고 시도하였는데 지식이 딸려서 어케해야할지 모르겠군요
이것을 SHDocVw를 쓰지않고 닷넷2.0 에서 자체지원하는 웹브라우져컨트롤을 사용하였습니다
microstft.mshtml 은 역시 닷넷 2.0 에 있는것으로 하였고요
프레임이 많아서 documentcomplete 가 많이 일어나는데 지정한주소의 프레임이 documentcomplete가
되었을때 파싱을 하려고 합니다
단순대기타이머로는 여러가지 에로사항이 많더군요
조언좀 부탁드립니다
=======================================================================================
저 부분을 해결하는 방법은 많이 있는데.
제가 쓰는 가장 쉬운 방법을 알려 드리겠습니다.
public Form1() { InitializeComponent(); webBrowser1.DocumentCompleted +=
new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted); } void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (webBrowser1.IsBusy == false) { //모든 문서가 완료되었을 때 } }
위의 코드처럼 DocumentCompleted 이벤트를 처리하는 핸들러에 WebBrowser의 IsBusy 프로퍼티를 확인하는 것 입니다.
IsBusy 가 true인 경우는 아직 다운 or 처리 해야할 문서가 남았있다는 이야기 입니다.
즉, 프레임일 경우 내부 프레임에 아직 덜 다운로드 된 문서가 있다는 것이지요.
모든 문서가 다운로드가 되면 비로서 IsBusy 프로퍼티는 false 상태로 변합니다.
일단 이 방법이 가장 쉬운 방법이니 한번 해보세요.
위의 질문처럼 원하는 프레임이 다운되었는지 판단하는 방법은 약간은 성가신 경우가 있습니다.
"프로그래밍 / TIP& Study" 분류의 다른 글
| [퀴즈] SQLite collate 문제 (0) | 2010/07/16 |
| [TIP] XP, Vista에서 CD/DVD롬이 보이지 않을 경우 (0) | 2009/08/05 |
| [C#] WinForm 에서 Docking 순서 변경하기 (0) | 2009/07/29 |
| [WPF] InkCanvas 사용하기 (0) | 2009/06/29 |
| [C#] Control Library 만들 때 TIP (0) | 2009/06/26 |
| [C#] 자연스럽게 Pen으로 그리기 (0) | 2009/06/23 |
| [WPF] Canvas의 Width, Height Binding (0) | 2009/06/23 |
| [C#] DateTime으로 7일 후는 어떻게? (0) | 2009/06/23 |

댓글을 달아 주세요
감사합니다 앞전에 조언주신것으로 해보니 한결 플이 부드러워졌네요
예측불가능한 에라가 많이 줄었습니다
웹브러아져 컨트롤써서 그런가 장시간 돌릴경우 메모리가 계속 상승해서 수백메가도 되는데 그걸 원인을 모르겠네요
모 암튼 그건 좀 연구를 해봐야 할것 같습니다 팝업헤제하는 dllimport 핸들을써서 그렇다고도 하시는분도 있고...
오늘여쭤볼내용은요 넘간단한거 같아서 지금까지 안여쭤보고 혼자해보려고 했는데
여적 해결을 못하고 있어서 또 이렇게 여쭙게 되었습니다;;
웹브라우져 컨트롤에 표시된 html 폼의 선택과 체크부분에 대해서 질문을 드리려고 합니다
여쭤볼부분은 라디오 버튼과 체크박스인데요
<input type="radio" name="choice_TYPE" value="0" style="height:14px;">1
<input type="radio" name="choice_TYPE" value="2" style="height:14px;">2
<input type="radio" name="choice_TYPE" value="1" style="height:14px;">3
위와 같은경우에 radio value="1" 에 체크가 되게하려면 어떻게 해야할까요
sendkey tab/tab/click 하니 포커스가 다른창에 있거나 로딩시시간초과될경우같은경우엔
에라가 나고 저페이지에서 진행이 다음으로 넘어가지가 않더라고요
-----------------------
<input name="a-case" type="checkbox" value="Y" />
<input name="b-case" type="checkbox" value="Y" checked="CHECKED" />
위와같이 체크박스가 하나는 선택이 되어있고
하나는 체크가 되어 있지를 않습니다.
그런데 상태가 항상저렇지가 않고 둘다 선택되어 있건 안되어 있건
체크를 안되게 하려고 합니다
클릭이벤트를 했더니 체크되있는것은 체크해제되서 맞는데
체크안된것은 체크로 처리가 되서 원하는 결과가 나오질 않더군요
다시한번 조언을 부탁드립니다
김시억님 저랑 같은 문제로 고민하셨군요~~ 저같은 경우
HtmlDocument doc = webBrowser1.Document;
doc.All["b-case"].SetAttribute("checked", "checked");
이런식으로 했었는데 도움이 될런지 모르겠네요.
주인장님~
네 말씀하신데로 하면 될 것 같아요~
대신 답변해주셔야 감사합니다 ^^
죄송한데......라디오 박스 체크하는방법도좀.;;;;;;
라디오 버튼도 똑같습니다.
HtmlElement를 찾아서 checked 속성에 checked 라고 주면 됩니다.
단, 위의 코드에서는 라디오 버튼의 각각의 ID가 없어서 이것만 추가하시면 쉽게 하실 수 있을겁니다.
예를 들어
<input id="1" type="radio" name="choice_TYPE" value="0" style="height:14px;">1
<input id="2" type="radio" name="choice_TYPE" value="2" style="height:14px;">2
<input id="3" type="radio" name="choice_TYPE" value="1" style="height:14px;">3
이렇게 라디오 버튼에 각각의 id를 부여하고
webBrowser1.Document.All["2"].SetAttribute("checked", "checked");
이렇게 작성하시면 Id가 "2"인 두번째 라디오 버튼에 체크가 되겠죠~
웹브라우저 연동에대해서 질문드립니다.
보통 사이트에서 웹브라우저로 컨트롤의 value를 수정할때,
webBrowser1.Document.getElementById("").SetAttribute("","");
로 하는편인데요. 이건 현재사이트에 컨트롤이 있을경우 이잖습니까?
근데, 사이트안에 아이프레임이 있을경우, 그안에있는
컨트롤들을 어떻게 제어하는지 궁금합니다.
아신다면 holic2206@naver.com 으로 답변좀 부탁드립니다ㅠ
window에서 frame들을 얻어오고,
원하는 프레임이 발견되면 그 프레임에서 HtmlDocument를 얻어서 하시면 됩니다.
관리자만 볼 수 있는 댓글입니다.
안될 이유는 없는 것 같습니다.
쿠키를 자동으로 전달하려면
C#의 WebBrowser 컨트롤 보다
MFC 쪽의 웹 브라우저 관련 컨트롤이 사용하기 편하실 겁니다.