Как обновить элементы управления [DataGrid, TextBoxes и Label] на основе выбора строки, сделанной в DataGrid, которая находится в updatePanel? - PullRequest
5 голосов
/ 10 мая 2011

У меня есть сетка [Grid1], которая строит свои dataRows при нажатии кнопки [search], мне удалось Ajaxify, поместив ее в UpdatePanel, и она работала нормально. До Ajaxifying Grid 1, другая сетка [Grid2] и некоторые другие элементы управления [Text and Labels] использовались для заполнения / обновления при щелчке строки в сетке 1.

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

После того, как я поместил Сетка 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','')");
     }

Ответы [ 4 ]

4 голосов
/ 10 мая 2011

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

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

2 голосов
/ 13 мая 2011

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

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

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

1 голос
/ 20 мая 2011

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

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-ification элемента управления.

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

protected void grdJobs_ItemDataBound(object sender, DataGridItemEventArgs e)
{
  e.Item.Attributes.Add("onclick", ClientScriptManager.GetPostBackEventReference(e.Item, string.Empty);
}
1 голос
/ 19 мая 2011

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

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

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

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

...