Здравствуйте.
 
 
Окончательно запутался.
 
 
В приложении, написанном на 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 не выполняются.
 
 
Можно как-то решить? В какую сторону копать?
Ответить
        |