Selecting/actioning items in Kendo UI widgets using Excel VBA

后端 未结 3 1643
时光说笑
时光说笑 2021-01-03 17:32

Stuck - Need help !

I\'m trying to automate actioning items in an IE web page on our internal company site. I\'m able to fill out any kind of text object

3条回答
  •  悲哀的现实
    2021-01-03 18:00

    This is how to select the first row of the kendoGrid:

    ie.Document.parentWindow.execScript "$('#drgdLease').data('kendoGrid').select('tr:eq(0)');"
    


    Below is a demo showing the equivalent code working on the official Kendo UI Grid Widget Demo page.

    Note the work-around for the possible race condition. While it may be that this particular race condition also applies in your case, there is another race condition that you need to be aware of.

    It's possible that, after having initiated the search for the lease number, and before the kendoGrid has finished updating, your code might attempt to select the first row. This would result in the first row of the default displayed data/previous search data being selected, and then the grid being updated, causing the selection to disappear.

    The work-around employed in the code below will not work in this case, as it will always (incorrectly) detect a selected row. A different workaround is needed. (I can think of a few - the most suitable probably depending on your exact use case.)

    '============================================================================================
    ' Module     : 
    ' Version    : 0.1
    ' Part       : 1 of 1
    ' References : Microsoft Internet Controls   [SHDocVw]
    ' Source     : https://stackoverflow.com/a/46483783/1961728
    '============================================================================================
      ' Required if late binding SHDocVw
      Private Enum tagREADYSTATE
        READYSTATE_UNINITIALIZED = 0
        READYSTATE_LOADING
        READYSTATE_LOADED
        READYSTATE_INTERACTIVE
        READYSTATE_COMPLETE
      End Enum
    
    Public Sub AutomateKendoUI()
    
      ' Create and use a new instance of IE
      With New SHDocVw.InternetExplorer '##Late Binding: CreateObject("InternetExplorer.Application")
        .Visible = True ' False is default
    
        .Navigate "http://demos.telerik.com/kendo-ui/grid/index"
        Do Until .Busy = False And .ReadyState = SHDocVw.tagREADYSTATE.READYSTATE_COMPLETE: DoEvents: Loop '##Late Binding: = tagREADYSTATE.READYSTATE_COMPLETE  ##No Enums: = 4
    
        ' Get and use the main DOM
        With .Document
          ' Race Condition Work-Around
          '   Kendo UI may not have finished loading the Grid data before we invoke its select method.
          '   Therefore, we continue to invoke the method until a selected row is detected.
          Do
            .parentWindow.execScript "$('#grid').data('kendoGrid').select('tr:eq(0)');"
            On Error Resume Next
              Dim elm_tr As MSHTML.HTMLTableRow: Set elm_tr = .querySelector("#grid tr.k-state-selected")
            On Error GoTo 0
          Loop While elm_tr Is Nothing
    
        End With
      End With
    End Sub
    


    Sources:

    From the official Kendo UI API documentation for the select method1:

    Example - select the first and second table rows
    ...

    var grid = $("#grid").data("kendoGrid");
    grid.select("tr:eq(1), tr:eq(2)");
    

    Note that this is actually wrong. The first row is at index 0, not index 1. A string parameter for the select method is treated as a jQuery selector, and from the official jQuery API documentation for the :eq() selector2:

    eq selector

    Description: *Select the element at index n within the matched set.*

    jQuery(":eq(index)")

    index: Zero-based index of the element to match.


    Interestingly, the official Kendo UI API documentation for the tbody object gets it right though3:

    Example - get the first table row
    ...

    var grid = $("#grid").data("kendoGrid");
    var row = grid.tbody.find("tr:eq(0)");
    


    1 http://docs.telerik.com/kendo-ui/api/javascript/ui/grid#methods-select
    2 https://api.jquery.com/eq-selector/
    3 http://docs.telerik.com/kendo-ui/api/javascript/ui/grid#fields-tbody

提交回复
热议问题