Здравствуйте.
Окончательно запутался.
В приложении, написанном на VB.NET понадобилось вызывать красивую табличку, при клике на содержимое которой оное содержимое подставляется в TextBox. Ввиду отсутствия удобных и красивых родных средств студии (?), я решил рисовать оную табличку в WebBrowser (HTML+CSS, и прочий блэкджек).
Далее я с удивлением узнал, что у WebBrowser нет события Click. Почесав задумчиво дебри гугла, я сделал так:
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
Dim document As HtmlDocument = WebBrowser1.Document
AddHandler document.Body.MouseDown, New HtmlElementEventHandler(AddressOf WebBrowser1_MouseDown)
End Sub
Private Sub WebBrowser1_MouseDown(ByVal sender As Object, ByVal e As HtmlElementEventArgs)
If e.MouseButtonsPressed = Windows.Forms.MouseButtons.Left Then
'Здесь считать значение переменной из тела документа
Dim Result = WebBrowser1.Document.Body.GetAttribute("currentObj")
LastSender.Text = Result
End If
End Sub
Действительно, теперь при клике на элементе формы типа WebBrowser срабатывает код внутри "Private Sub WebBrowser1_MouseDown".
Далее, со стороны самого html-документа имеем следующий скрипт:
<SCRIPT>
document.body.currentObj="no";
//Перебираем все div внутри главного div (id="content") и навешиваем обработчик событий
window.onload = function() {
var div = document.getElementById('content').getElementsByTagName('div'), i = div.length;
while(i--)
{
div[i].onclick = function(i) {
return function()
{
if (div[i].id=='value')
{
onClick(div[i].innerHTML);
}
};
}(i);
}
};
function onClick(obj)
{
document.body.currentObj = obj;
};
</SCRIPT>
По идее, теперь клик на любой div с id="value" должен помещать в переменную currentObj содержимое этого div. Собственно, так и происходит. Команда "Dim Result = WebBrowser1.Document.Body.GetAttribute("currentObj")" должна это наше currentObj считывать, что, опять же, работает. НО!
Но JS скрипт выполняется только после завершения процедуры WebBrowser1_MouseDown. Таким образом, работает всё следующим образом:
1) Запускаем программу, загружается форма с WebBrowser
2) Пользователь кликает по WebBrowser
3) В процедуре WebBrowser1_MouseDown считывается значение нужной переменной: WebBrowser1.Document.Body.GetAttribute("currentObj"). Да, именно. J-скрипит ещё не выполнен, а оно уже считывается. Поэтому мы получаем "no" в currentObj (этим значением он инициализируется при загрузке html-документа.
4) Только теперь выполняется J-скрипт, и в переменную currentObj заносится нужное значение из кликнутого div.
Таким образом, чтобы в VB получить нужное значение, приходится кликать по div два раза. Потому что до завершения основной VB-программы, никакие JS в WebControl не выполняются.
Можно как-то решить? В какую сторону копать?
Ответить
|