Вы можете вычислить значение текущего идентификатора главной строки в событии изменения:
var nmr = +e.sender.element.closest('tr').prev().find('[role=gridcell]:first').text();
Таким образом, после каждого цикла вы можете открыть следующую главную строку:
grid.expandRow(".k-master-row:eq(" + nmr + ")");
$(".k-master-row:eq(" + nmr + ")").addClass("k-state-selected");
var gridData = [{
"ID": "1",
"FName": "Adam",
"LName": "Zoo"
},
{
"ID": "2",
"FName": "Ben",
"LName": "York"
},
{
"ID": "3",
"FName": "Chris",
"LName": "Xavier"
},
{
"ID": "4",
"FName": "Dan",
"LName": "Went"
},
{
"ID": "5",
"FName": "Eddy",
"LName": "Victor"
},
{
"ID": "6",
"FName": "Freddy",
"LName": "Under"
},
{
"ID": "7",
"FName": "George",
"LName": "Trenton"
},
{
"ID": "8",
"FName": "Harry",
"LName": "Salvador"
}
];
var detailData = [{
"ID": "9",
"City": "Arlen",
"Province": "Ontario"
},
{
"ID": "10",
"City": "Bancroft",
"Province": "Ontario"
},
{
"ID": "11",
"City": "Calgary",
"Province": "Alberta"
},
{
"ID": "12",
"City": "Dartmouth",
"Province": "Ontario"
},
{
"ID": "13",
"City": "Embro",
"Province": "Ontario"
},
{
"ID": "14",
"City": "Fullerton",
"Province": "Ontario"
},
{
"ID": "15",
"City": "Georgetown",
"Province": "Ontario"
},
{
"ID": "16",
"City": "Huntsville",
"Province": "Ontario"
}
]
$(document).ready(function () {
LoadGridData();
});
function LoadGridData() {
$('#MyGrid').kendoGrid({
dataSource: {
data: gridData
},
schema: {
model: {
id: "ID",
fields: {
ID: {
type: "string"
},
FName: {
type: "string"
},
LName: {
type: "string"
}
}
}
},
columns: [{
field: "ID",
title: "ID"
},
{
field: "FName",
title: "First"
},
{
field: "LName",
title: "Last"
}
],
height: 550,
detailInit: detailInitGrid,
detailExpand: function (e) {
this.select(e.detailRow.prev());
this.collapseRow(this.tbody.find('> tr.k-master-row').not(e.masterRow));
}
});
}
var masterRow;
function detailInitGrid(e) {
masterRow = e.masterRow;
$("<div/>").appendTo(e.detailCell).kendoGrid({
dataSource: {
data: detailData
},
columns: [{
field: "ID",
title: "ID"
},
{
field: "City",
title: "City"
},
{
field: "Province",
title: "Province"
}
],
selectable: true,
change: function (e) {
let index = this.select().index();
let dataItem = this.dataSource.view()[index];
let grid = $("#MyGrid").data("kendoGrid");
$(".k-master-row").each(function (idx, ele) {
grid.collapseRow(this);
$(this).removeClass("k-state-selected");
});
// open next master row...
var nmr = +e.sender.element.closest('tr').prev().find('[role=gridcell]:first').text();
grid.expandRow(".k-master-row:eq(" + nmr + ")");
$(".k-master-row:eq(" + nmr + ")").addClass("k-state-selected");
}
});
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://kendo.cdn.telerik.com/2019.1.115/styles/kendo.common.min.css">
<link rel="stylesheet" href="https://kendo.cdn.telerik.com/2019.1.115/styles/kendo.rtl.min.css">
<link rel="stylesheet" href="https://kendo.cdn.telerik.com/2019.1.115/styles/kendo.default.min.css">
<link rel="stylesheet" href="https://kendo.cdn.telerik.com/2019.1.115/styles/kendo.mobile.all.min.css">
<script src="https://kendo.cdn.telerik.com/2019.1.115/js/kendo.all.min.js"></script>
<div id="MyGrid"></div>
Я не знаю никакого события, что можно смотреть, чтобы показать, что объект был добавлен к ListBox. Возможно, можно использовать метод Win32, который Вы описали вместо этого (т.е. захватите дескриптор, используйте WndProc, и т.д.).
Поочередно, возможно, можно использовать другой класс, который добавляет объекты вместо этого. Например, вместо того, чтобы назвать Добавить метод на ListBox непосредственно, у Вас мог быть вызов пользовательских действий Добавить метод в новом классе, который тогда добавляет объект к ListBox. Вы могли установить событие в том классе, который позволит Вам наблюдать то, что было добавлено.
мне также нравится идея разделить ListBox на подклассы, как упомянуто другим плакатом....
Вот сообщение на другом форуме, который рекомендует создать дочерний класс, который включает то поведение.
http://www.eggheadcafe.com/forumarchives/netframeworkcompactframework/jul2005/post23265940.asp
К сожалению, нет никакого простого способа сделать это наследование использования или события. Необходимо быть в состоянии переопределить Добавить метод класса Объектов, но Вы не можете добраться до него! Можно быть в состоянии прервать цикл сообщения для выяснения, когда это происходит, но это вне моего опыта.
Одна вещь, которую я заметил от Вашего вопроса, состоит в том, что Вы упоминаете, что объекты добавляются асинхронно. Не делайте этого. Ваша проблема может быть решена, если Вы синхронизируетесь на потоке формы (если Ваша проблема состоит в том, что управление не обновляет).