gpt4 book ai didi

vba - 使用 Excel VBA 在 Kendo UI 小部件中选择/操作项目

转载 作者:行者123 更新时间:2023-12-04 21:56:43 27 4
gpt4 key购买 nike

卡住 - 需要帮助!

我正在尝试在我们公司内部网站的 IE 网页中自动执行操作项目。我可以填写任何类型的文本对象 , 点击 提交按钮 等等,但有几个项目在 中。网格/表格(剑道网格)下拉列表。我似乎无法弄清楚如何从这些网格/表格或下拉列表中进行选择。

我已经尝试了我能想到的一切,但无济于事。我用过getElementById() , getElementsByTagName() , getElementsByName() ,甚至一些网页抓取技术。

不幸的是,由于该网页位于内部站点上,因此没有其他人能够对其进行测试。

这是我的代码的主要部分

 'After opening the web page, inserting a number, selecting the "search"
' (all from the VBA script), I have to use a "mousemove", "mousedown" and
' "mouseup" to select the item, whick is what the "myClick" subroutine does

myClick '<<< THIS IS WHAT I WANT TO GET RID OF >>>

'I left the following segment in to show that I'm able to do several other functions
myDocs = ie.Document.getElementById("DispatchComments").Value

If myInfo = True Then
ie.Document.getElementById("DispatchComments").Value = "__" & myCell5 & "__" & myDocs
Else: End If

'IF ESTIMATED TIME IS LESS THAN 0, ENTER 120 - Enter estimated time
If ie.Document.getElementById("TotalEstimatedTime").Value < 10 Then
ie.Document.getElementById("TotalEstimatedTime").Value = 120

Else: End If

End With

End Sub

`

这是 screen shot输入租约号码并单击搜索按钮后。我设法选择该行的唯一方法是以编程方式在所示的三个白色背景区域之一中单击鼠标。我的代码使用 mousemove和坐标选择行,向下滚动到一个坦克下拉菜单并单击它打开,这样我就可以手动选择一个坦克编号。

这部分代码是我卡住的地方
Set myChoice1 = ie.Document.getElementById("drgdLease").getElementsByTagName("tr")(1)
With myChoice1
.getElementsByTagName("td")(0).Focus '<<---Works all the way to here
.FireEvent ("onmouseover") '<<---No errors from this point on
.FireEvent ("onmousedown") 'but doesn't do anything
.FireEvent ("onmouseup")
.FireEvent ("onclick") '<<---some other things tried
.FireEvent ("ondblclick")
.FireEvent ("onselect")
td.innerText = value
td.innerHTML = value
End With

'<tr role="row" data-uid="db62d811-4337-477c-a0fd-0e9e036670bb">
' <td role="gridcell">998262</td> '<<---This is the info/row I need to select
' <td role="gridcell">HENDERSON (SMACKOVER) STORAGE</td>
' <td role="gridcell">ORYAN OIL &amp; GAS</td>

检查我尝试选择的区域的元素会显示此 HTML

 name="Result">
<div class="k-widget k-grid" id="drgdLease" style="-ms-touch-action: double-tap-zoom pinch-zoom;" data-role="grid">
<table class="k-selectable" role="grid" style="-ms-touch-action: double-tap-zoom pinch-zoom;" data-role="selectable">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead class="k-grid-header" role="rowgroup">
<tr role="row">
<th class="k-header k-with-icon" scope="col" data-title="Lease Number" data-index="0" data-field="LeaseCode" data-role="columnsorter">
<a tabindex="-1" class="k-header-column-menu" href="#">
<span class="k-icon k-i-arrowhead-s"></span>
</a>
<a class="k-link" href="/LeaseProfiles/GetLeasesSearch?Length=9&amp;drgdLease-sort=LeaseCode-asc">Lease Number</a>
</th>
<th class="k-header k-with-icon" scope="col" data-title="Lease Name" data-index="1" data-field="LeaseName" data-role="columnsorter">
<a tabindex="-1" class="k-header-column-menu" href="#">
<span class="k-icon k-i-arrowhead-s"></span>
</a>
<a class="k-link" href="/LeaseProfiles/GetLeasesSearch?Length=9&amp;drgdLease-sort=LeaseName-asc">Lease Name</a>
</th>
<th class="k-header k-with-icon" scope="col" data-title="Lease Operator" data-index="2" data-field="LeaseOperator.OperatorName" data-role="columnsorter">
<a tabindex="-1" class="k-header-column-menu" href="#">
<span class="k-icon k-i-arrowhead-s"></span>
</a>
<a class="k-link" href="/LeaseProfiles/GetLeasesSearch?Length=9&amp;drgdLease-sort=LeaseOperator.OperatorName-asc">Lease Operator</a>
</th>
</tr>
</thead>

<!--
This is what the code looks like before selecting the item.
ie: before clicking anywhere on the row.
-->

<tbody role="rowgroup">
<tr role="row" data-uid="db62d811-4337-477c-a0fd-0e9e036670bb">
<td role="gridcell">998262</td>
<td role="gridcell">HENDERSON (SMACKOVER) STORAGE</td>
<td role="gridcell">ORYAN OIL &amp; GAS</td>
</tr>
</tbody>
</table>

<!--
This is what the code changes to after clicking the row.
Note the class and arial are added on the `tr role` line, which may be binding the data.
-->

<tr role="row" data-uid="db62d811-4337-477c-a0fd-0e9e036670bb" class = "k-state- selected" arial = "true">
<td role="gridcell">998262</td>
<td role="gridcell">HENDERSON (SMACKOVER) STORAGE</td>
<td role="gridcell">ORYAN OIL &amp; GAS</td>

最佳答案

这是选择 kendoGrid 第一行的方法:

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

下面是一个演示,显示了在官方 Kendo UI Grid Widget Demo 上工作的等效代码页。

请注意可能的竞争条件的解决方法。 虽然这种特定的竞争条件可能也适用于您的情况,但您需要注意另一个竞争条件。

在开始搜索租约号之后,并且在 kendoGrid 完成更新之前,您的代码可能会尝试选择第一行。这将导致选择默认显示数据/先前搜索数据的第一行,然后更新网格,导致选择消失。

下面的代码中使用的解决方法不会工作在这种情况下,因为它总是(错误地)检测到选定的行。需要不同的解决方法。 (我能想到一些 - 最合适的可能取决于您的确切用例。)
'============================================================================================
' Module : <in any standard 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

来源:

来自 official Kendo UI API documentation对于 select方法 1 :

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

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


请注意,这实际上是 错了 .第一行位于索引 0,而不是索引 1。select 方法的字符串参数被视为 jQuery 选择器,并且来自 official jQuery API documentation对于 :eq()选择器 2 :

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.



有趣的是, official Kendo UI API documentation对于 tbody尽管 3 对象正确:

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

关于vba - 使用 Excel VBA 在 Kendo UI 小部件中选择/操作项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43127317/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com