Как обновить элементы управления [DataGrid, текстовые поля и Label] на основе выбора строки, сделанного в DataGrid, который остается в UpdatePanel?

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

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

Вопрос:

У меня есть сетка [Grid1], которая строит свои потоки данных при нажатии кнопки [поиск], мне удалось изменить ее, поместив в UpdatePanel, и она отлично работала. До преобразования сетки 1 в Ajax другая сетка [Grid2] и некоторые другие элементы управления [Текст и метки] заполнялись / обновлялись при нажатии на строку в сетке 1.

Grid2 и другие элементы управления, используемые для заполнения / обновления при событии OnItemCommand в Grid 1. Это код в OnItemCommand, который привязывает соответствующие данные к Grid2 и другим элементам управления.

После того, как я поместил Grid 1 на панель обновления, они перестали обновляться. Все будет работать нормально, если я помещу Grid2 и другие элементы управления на ту же панель обновления, но страница спроектирована таким образом, что я не могу размещать эти элементы управления на той же панели обновления, что и первая сетка, и я не собираюсь использовать другую панель обновления.

Я надеюсь, что я вношу некоторый смысл. Я новичок в .Net поэтому, пожалуйста, извините. Пожалуйста, найдите код ниже.

  <asp:ScriptManager EnablePartialRendering="true" ID="ScriptManager1" runat="server"></asp:ScriptManager>
     <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers ="True">
      <ContentTemplate>
       <asp:DataGrid ID="grdJobs" runat="server" AllowPaging="true" 
        AlternatingItemStyle-CssClass="gridAltItemStyle"
        AutoGenerateColumns="False" CellPadding="0" 
        DataKeyField="code"
        CssClass="datagridBox" 
        GridLines="horizontal" 
        PagerStyle-Mode="NumericPages"
        HeaderStyle-CssClass="gridHeaderStyle" 
        ItemStyle-CssClass="gridItemStyle"
        PagerStyle-CssClass="gridPagerStyle" 
        Width="445px" OnPageIndexChanged="grdJobs_PageIndexChanged" OnItemCreated="grdJobs_ItemCreated" OnItemCommand="grdJobs_ItemCommand"             OnItemDataBound="grdJobs_ItemDataBound">
         <Columns>
          <asp:BoundColumn  DataField="J_ID" HeaderText="Job"></asp:BoundColumn>
          <asp:BoundColumn  DataField="Contract" HeaderText="Contract" ReadOnly="True"></asp:BoundColumn>
          <asp:BoundColumn  DataField="J_Fault_Line1" HeaderText="Fault" ReadOnly="True"></asp:BoundColumn>
          <asp:BoundColumn  DataField="j_p_id" HeaderText="Fault" Visible="false" ></asp:BoundColumn>
          <asp:ButtonColumn Text="<img src=images/addFeedback.gif style=border: 0px; alt=Add Feedback>" ButtonType="LinkButton"  HeaderText="Add"                   CommandName="Load" ItemStyle-cssClass="Col_9_Item_2"></asp:ButtonColumn>
         </Columns>
        </asp:DataGrid>
       <asp:ImageButton ID="cmdLkp"  ImageUrl="Images/search.gif" runat="server" OnClick="cmdLkp_Click" />

       </ContentTemplate>
      </asp:UpdatePanel>
  

Приведенный ниже код в исходном коде перестал работать

 protected void grdJobs_ItemCommand(object source, DataGridCommandEventArgs e)
    {

        if (e.CommandName == "Load")
        {
            functionToBindDataToGrid2();
            functionToBindDataToOtherControls();
        }
}

 protected void grdJobs_ItemDataBound(object sender, DataGridItemEventArgs e)
    {
      e.Item.Attributes.Add("onclick", "javascript:__doPostBack('grdJobs$ctl"   ((Convert.ToInt32(e.Item.ItemIndex   3).ToString("00")))   "$ctl00','')");
     }
  

Комментарии:

1. Когда вы говорите, что хотите «принудительно выполнить обратную передачу», вы имеете в виду, что после щелчка по строке в Grid1 вы хотите, чтобы Grid1 выполнила некоторую работу на панели обновления, затем страница выполняет полную обратную передачу, и при перезагрузке страницы обновляется Grid2?

2. @Alison, пожалуйста, игнорируйте бит принудительной обратной передачи. Есть несколько строк кода, который привязывает данные к Grid2 в functionToBindDataToGrid2(), они не работают, они работали до того, как я поместил Grid 1 в UpdatePanel. Данные в Grid2 основаны на выборе [щелчком по строке], сделанном в Grid 1. Если вы хотите, я могу также опубликовать этот код, чтобы вы могли взглянуть. Надеюсь, я вношу некоторый смысл

3. Это сложная ситуация. Вы выполняете частичную обратную отправку UpdatePanel, которая обновит только содержимое, находящееся внутри панели обновления. Без полной обратной передачи содержимое за пределами updatepanel просто не будет обновляться. Есть ли причина, по которой вы не хотите помещать Grid2 в другую панель обновления? Это не идеально, но это должно решить ваши проблемы.

4. @Alison Я знаю, что это сложно, страница спроектирована таким образом, что вы не можете использовать Grid2 в той же панели обновления. Да, это сработало бы, если бы я поместил его на ту же панель обновления или если бы я поместил Grid 2 на отдельную панель обновления. Я видел в Интернете статьи о том, как обновить одну метку или один текстовый элемент управления с помощью RegisterDataIteme вне UpdatePanel, но ничего не связано с сетками. И у меня есть дюжина элементов управления текстом / метками для заполнения.

5. Я искал что-то похожее на это, но для сеток aspnetajaxtutorials.com/2011/02 / …

Ответ №1:

В свойствах для UpdatePanel установите режим обновления на «Условный», а дочерние триггеры на «true».

Другим вариантом было бы переместить кнопку внутри панели обновления, чтобы вам не приходилось запускать триггер.

Комментарии:

1. @epotter спасибо за ваш совет, но это не сработало. Триггер работает нормально, это события в сетке, которые не работают. Они работали до того, как я разместил их в UpdatePanel

2. @manraj82 Важной частью его ответа является установка ChildrenAsTriggers="true" .

3. ребята, это все еще не работает, я попробовал ваш совет, но безуспешно. Когда я навожу курсор мыши на столбец button, я вижу __doPostBack() но, похоже, это ничего не делает, ранее сетка использовалась для обратной записи и заполнения второй сетки и элементов управления. Есть ли у вас какие-либо ссылки на учебные пособия или статьи, посвященные сеткам данных, на панели обновления

4. @epotter <asp: PostBackTrigger ControlID=»grdJobs» />, это заставило его работать, он не выполнял обратную передачу, как только я добавил этот код, он начал выполнять обратную передачу. Как вы думаете, мне все еще понадобятся ChildrenAsTriggers =»False» UpdateMode =»Conditional»??

5. @manray82 — Если вы установите точку останова в grdJobs_ItemCommand, попадет ли она, если вы нажмете кнопку в строке?

Ответ №2:

GridView — это сложный asp.net управление сервером. У вас возникнут большие трудности с обновлением Grid2 после обновления Grid1 внутри UpdatePanel. Однако, возможно выполнить JavaScript на клиенте после обновления Grid1. Вы могли бы обновить Grid1 внутри панели обновления, выполнить JavaScript после обновления Grid1, который обновит HTML на странице. Проблема в том, что обновление Grid2 с помощью Javascript будет кошмарным объемом работы.

Вот пример того, о чем я говорю: Просмотр сетки с поддержкой Ajax с использованием JavaScript в ASP.NET . Это полный взлом, огромный объем работы, и ваши коллеги возненавидят вас, когда им придется это поддерживать.

Если бы вы хотели обновить ярлык или выпадающий список, то это было бы возможно, но обновление GridView с использованием Javascript и сохранение этих обновлений при обратной передаче является сложной задачей.

Комментарии:

1. Важным моментом в приведенном выше является «сохранение этих обновлений при обратной передаче …». Я бы подошел к этому так, чтобы «дочерняя» сетка всегда создавалась на клиенте с использованием JS-шаблона на стороне клиента и JSON. Разработчику-новичку довольно сложно прийти в себя, но это может дать легко поддерживаемый код. Сделав это, конечно, решение первоначальной проблемы тривиально.

2. Я согласен, что есть много «лучших» способов сделать это, и для этого потребуется опытный front amp; back-end разработчик, чтобы это произошло. Размещение Grid2 внутри updatepanel решило бы все проблемы операционной системы. Что нам действительно всем следует обсудить, так это то, почему он не может использовать updatepanel, а затем решить эту проблему.

3. извините, что я опоздал с ответом на ваш ответ, я должен вам 75 баллов. Мне пришлось заставить это работать, поместив обе сетки в UpdatePanel, как вы сказали, это был сложный вызов для обновления сетки с использованием javascript…

4. @manraj82: Нет проблем. Хотелось бы, чтобы у меня был для вас ответ получше, чем «не делайте этого. Это невозможно сделать.»

Ответ №3:

Используйте несколько панелей обновления на одной странице. Это не повлияет на макет.

Затем вы можете использовать триггеры (для панелей), чтобы повлиять на то, какие элементы управления вы хотите затронуть.

Вот страница, которая поможет вам понять.

http://www.asp.net/ajax/tutorials/understanding-asp-net-ajax-updatepanel-triggers

Ответ №4:

Ваша проблема заключается в том, как вы запускаете обратную передачу при щелчке по строке, т. Е. Этот метод

 protected void grdJobs_ItemDataBound(object sender, DataGridItemEventArgs e)
{
  e.Item.Attributes.Add("onclick", "javascript:__doPostBack('grdJobs$ctl"   ((Convert.ToInt32(e.Item.ItemIndex   3).ToString("00")))   "$ctl00','')");
}
  

Ручное написание __doPostBack скрипта, как правило, всегда является плохой идеей. Я полагаю, что вместо этого вам нужно использовать ClientScriptManager.GetPostBackEventReference который создаст для вас похожий сценарий обратной отправки, но будет учитывать всевозможные другие вещи, включая AJAX-идентификацию элемента управления.

Попробуйте что-то вроде этого вместо:

 protected void grdJobs_ItemDataBound(object sender, DataGridItemEventArgs e)
{
  e.Item.Attributes.Add("onclick", ClientScriptManager.GetPostBackEventReference(e.Item, string.Empty);
}