Boundfield JS сломан при частичной обратной отправке с использованием LoadControl

#c# #javascript #asp.net #ajax #updatepanel

#c# #javascript #asp.net #ajax #updatepanel

Вопрос:

Я создаю панель мониторинга, в которой у нас есть 6 панелей обновлений, которые пользователи могут выбирать над каждой из них из ddl, что отображается в UpdatePanel. Когда пользователь изменяет индекс ddl над панелью обновления, вызываются функции на стороне сервера для загрузки соответствующего пользовательского элемента управления. Все отлично работает при начальной загрузке страницы; однако, как только происходит частичная обратная отправка, мне трудно найти правильные html-элементы, используя мою функцию ниже. Сегодня я около 10 часов рыскал по Интернету в поисках ответа и, похоже, не могу найти правильное решение.

Все пользовательские элементы управления используют одну и ту же js-функцию «ActivateGridViewRow». Я пробовал как UniqueID, так и ClientID для ссылки на соответствующие элементы HTML в документе HTML, но ничего не работает хорошо. Обратите внимание, что есть главная страница, и я не могу использовать «this» вместо e.Row.ClientID /UniqueID в качестве аргумента js, потому что не всегда «активируемый» элемент является «строкой» GridView.

Это код из одного из пользовательских элементов управления «GridView_RowDataBound»…

 [Control].Attributes.Add("onclick", "ActivateGridViewRow('"   
    e.Row.DataItemIndex % gv_Trends.PageSize   "', '"   e.Row.UniqueID   "', '"   
    e.Row.CssClass   "', '"   e.Row.FindControl("img_ActivateRow").ClientID   "', '"   
    e.Row.FindControl("tr_ChildRow").UniqueID   "', 'false')");
  

Пример js-функции «ActivateGridViewRow»…

 function ActivateGridViewRow(RowIndex, RowId, RowCssClass, RowImgId, ChildRowId, DoCallBack) {
    if (ChildRowId != "") {
        //var Row = $get(RowId);
        var Row = $get(RowId);
        if (Row == null) Row = $get("ctl00_MainContent_ctl02_"   RowId);
        var ChildRow = $get(ChildRowId);
        if (ChildRow == null) ChildRow = $get("ctl00_MainContent_ctl02_"   ChildRowId);
        var RowImg = $get(RowImgId);
        if (RowImg == null) RowImg = $get("ctl00_MainContent_ctl02_"   RowImgId);

        if (ChildRow.style.display == '') {
            ChildRow.style.display = 'none';
            Row.Class = RowCssClass;
            Row.style.backgroundColor = "";
            if (RowImg != null) RowImg.src = "http://localhost/resources/images/expand_blue.jpg";
            return false;
        }
        else {
            ChildRow.style.display = '';
            ChildRow.style.backgroundColor = "#F5F5F5";
            Row.Class = "";
            Row.style.backgroundColor = "#F5F5F5";
            if (RowImg != null) RowImg.src = "http://localhost/resources/images/collapse_blue.jpg";
            if (DoCallBack == "true") CallServer(RowIndex, "");
            return true;
        }
    }
}
  

* Примечание — после частичной обратной отправки возвращаемый UniqueID не содержит родительских элементов управления с префиксами (т. Е. идентификатора contentplaceholder и т. Д.)…поэтому он не уникален, если элементы управления используются повторно и т. Д…

Ответ №1:

Всем, кто может прочитать это в будущем…в итоге я передал «this» для всего, что требовало действия js в пользовательском элементе управления…частичные обратные отправки разрушили идентификаторы клиентов, поэтому они стали бесполезными. Единственный способ, которым я обнаружил, что это сработало, — переделать все для передачи ссылок на себя…надеюсь, это поможет кому-то еще 🙂