Вложенная Ajax UpdatePanel в Gridview требует двойного нажатия кнопки управления

У меня есть расширяемый GridView с TemplateField, который имеет TextBox и кнопку, где, идея заключается в том, что при нажатии кнопки он сохранит содержимое textBox в базе данных. На данный момент я не смог загрузить содержимое TextBox в базу данных, так как у меня возникла проблема при его тестировании.

У меня есть Gridview внутри Ajax UpdatePanel, а TexBox и кнопка внутри TemplateField также внутри Ajax UpdatePanel.

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

Следуя другой публикации ( почему нужно дважды щелкнуть элемент управления кнопкой?), Я старался изо всех сил содержать всю информацию во вложенном UpdatePannel. Тем не менее я не могу избавиться от проблемы. Я предполагаю, что проблема заключается в попытке найти элемент управления TextBox в строке, чтобы я мог редактировать текст, но я не могу понять, как избежать использования FindControl.

Смотрите ниже код:

<script language="javascript" type="text/javascript">
    function divexpandcollapse(divname) {var div = document.getElementById(divname);
        var img = document.getElementById('img' + divname);
        if (div.style.display == "none") {
            div.style.display = "block"; img.src = "Images/Icons/minus.jpg";
        } else { div.style.display = "none"; img.src = "Images/Icons/plus.jpg"; }
    }</script>

<asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server" ScriptMode="Release"
    CompositeScript-ScriptMode="Release" AllowCustomErrorsRedirect="False" EnablePartialRendering="true">
</asp:ToolkitScriptManager>

<asp:UpdatePanel ID="UP_TabContainer" runat="server" UpdateMode="Conditional">
<ContentTemplate>
 <asp:DropDownList ID="DateSelection" runat="server" AutoPostBack="True"> </asp:DropDownList>
 <asp:GridView ID="GV_SL" runat="server" OnRowDataBound="gvUserInfo_RowDataBound"
  OnRowCommand="GV_SL_RowCommand" AutoGenerateColumns="False" DataSourceID="SQL_Weekly">
    <Columns>

     <asp:TemplateField ItemStyle-Width="50px">
     <ItemTemplate>
      <a href="JavaScript:divexpandcollapse('div<%# Eval("reporting_group") %>');">
       <img id="imgdiv<%# Eval("reporting_group") %>" width="15px" border="0" src="Images/Icons/plus.jpg" /></a>
     </ItemTemplate>
    <ItemStyle Width="40px" />
    </asp:TemplateField>

    <asp:BoundField DataField="name" HeaderText="Group" SortExpression="name" />
    <asp:BoundField DataField="reporting_group" HeaderText="ID" ReadOnly="True" SortExpression="reporting_group" />

    <asp:TemplateField>
     <ItemTemplate>
      <tr>
       <td colspan="100%">
        <div id="div<%# Eval("reporting_group") %>" style="display: none; position: relative;
         left: 15px; overflow: auto">
          <asp:GridView ID="gvChildGrid" runat="server" AutoGenerateColumns="false">
           <Columns>
            <asp:BoundField DataField="Metric" HeaderText=" " HeaderStyle-HorizontalAlign="Left" />
            <asp:BoundField DataField="Actual" HeaderText="Actual" HeaderStyle-HorizontalAlign="Left" />
             </Columns>
          </asp:GridView>

          <asp:UpdatePanel ID="UP_Comments" runat="server" UpdateMode="Always">
           <ContentTemplate>
             <asp:TextBox ID="TB_Comments" runat="server" Text="Example: Text will be entered here"></asp:TextBox>
             <asp:Button ID="B_Save" runat="server" CommandName="AddText" CommandArgument="<%# CType(Container,GridViewRow).RowIndex  %>"
              Text="Save Changes" />
             <asp:Label ID="Label1" runat="server" Text='<%# eval("reporting_group")  %>' Visible="False"></asp:Label>
           </ContentTemplate>
          </asp:UpdatePanel>
         </div>
        </td>
       </tr>
      </ItemTemplate>
     </asp:TemplateField>
    </Columns>
   </asp:GridView>
  </ContentTemplate>
   <Triggers>
     <asp:AsyncPostBackTrigger ControlID="DateSelection" EventName="SelectedIndexChanged" />
   </Triggers>
</asp:UpdatePanel>

Код кнопки VB позади

Protected Sub GV_SL_RowCommand(ByVal sender As Object, _
ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs)
    If (e.CommandName = "AddText") Then
        ' Retrieve the row index stored in the CommandArgument property.
        Dim index As Integer = Convert.ToInt32(e.CommandArgument)
        ' Retrieve the row that contains the button 
        ' from the Rows collection.
        Dim row As GridViewRow = GV_SL.Rows(index)
        Dim LB_RG As System.Web.UI.WebControls.Label = DirectCast(row.FindControl("Label1"), System.Web.UI.WebControls.Label)
        Dim TB_Com_Control As System.Web.UI.WebControls.TextBox = DirectCast(row.FindControl("TB_Comments"), System.Web.UI.WebControls.TextBox)
        TB_Com_Control.Text = "Test " & "-" & LB_RG.Text
    End If
End Sub

Я надеюсь, что кто-нибудь может помочь мне попытаться определить, где проблема и как ее решить.

1 ответ

Мне удалось решить эту проблему, обернув следующие элементы управления в UpdatePanel ID = "UP_TabContainer":

  • GridView ID = "GV_SL"
  • DataSourceID = "SQL_Weekly"

и исключая:

  • функция divexpandcollapse (divname)
  • ToolkitScriptManager ID = "ToolkitScriptManager1"
  • DropDownList ID = "DateSelection"

Я не уверен, почему это работает, но я надеюсь, что это кому-то поможет.

Другие вопросы по тегам