【问题标题】:Using GridView inside UpdatePanel在 UpdatePanel 中使用 GridView
【发布时间】:2012-03-04 16:21:11
【问题描述】:

我里面有一个更新面板和网格视图。

<asp:UpdatePanel ID="uplPanel" UpdateMode="Conditional" runat="server" OnLoad="uplPanel_Load">
<ContentTemplate>
 <asp:GridView ID="gvPrList" runat="server" AutoGenerateColumns="false" AllowPaging="false"
       AllowSorting="false" CssClass="list-table" HeaderStyle-CssClass="header">
       <Columns>
     <ItemTemplate>
               <asp:Button ID="btnEdit" runat="server" Text="Edit" CssClass="button save" OnCommand="onPrItemCmd"
                   CommandName="editRow" CommandArgument='<%#Bind("ID") %>' Style="width: 80px" />
               <asp:Button ID="btnDelete" runat="server" Text="Delete" CssClass="button save" OnCommand="onPrItemCmd"
                   CommandName="deleteRow" CommandArgument='<%#Bind("ID") %>' Style="width: 80px" />
           </ItemTemplate>
       </asp:TemplateField>
   </Columns>

当我单击 Griview 中的按钮时,它不会触发事件。 有什么想法吗?

【问题讨论】:

    标签: c# asp.net asp.net-ajax updatepanel


    【解决方案1】:

    这对我有帮助。 在我的情况下,我正在更改 asp:DropDownList 控件中的值,然后返回服务器以更新我的 asp:GridView,它位于不同的 asp:UpdatePanel 中。我只是忘记添加代码以使用列表刷新更新面板。一旦我这样做了,一切都很好。

    服务器端

    System.Data.DataSet ds = MySQL.DAL.GetRecord(sql);
    GV_View.DataSource = ds;
    GV_View.DataBind();
    UP_MainList.Update(); //refresh the update panel
    

    aspx代码

                <asp:UpdatePanel runat="server" ID="UP_ListChange" UpdateMode="Conditional">
                    <ContentTemplate>
                        <asp:DropDownList runat="server" ID="ddFilter" DataTextField="Desc" AutoPostBack="true" DataValueField="Detail" OnSelectedIndexChanged="GV_CodeView_RefreshScreen" ></asp:DropDownList>
                    </ContentTemplate>
                 </asp:UpdatePanel>
                <div class="medium">Select Filter to view database codes</div>
            </div>
            <div class="div-row-header" runat="server" id="divList">
            <asp:UpdatePanel runat="server" ID="UP_MainList" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:GridView ID="GV_View" runat="server" AllowSorting="True" AutoGenerateColumns="false" DataKeyNames="id">
                    <Columns>
                        <asp:BoundField DataField="Id" HeaderText="Id" Visible="false" />
                        <asp:BoundField DataField="Type_Cd" HeaderText="Code" />
                        <asp:BoundField DataField="Short_Desc" HeaderText=" Description" />
                        <asp:TemplateField HeaderText="">
                            <ItemTemplate>
                                <asp:Button ID="Code_Edit" runat="server" Text="Edit" onClick="GV_Code_Edit_Click" class="button" />
                            </ItemTemplate>
                        </asp:TemplateField>
                    </Columns>             
            </ContentTemplate>
    
            </asp:UpdatePanel>
            </div>
    

    【讨论】:

      【解决方案2】:

      我也有类似的问题。

      根据您的情况,就像我的情况一样...更新面板内的所有可点击控件我都希望成为触发器;所以我可以简单地使用 UpdatePanel 属性 'ChildrenAsTriggers="true"' 来解决问题。

          <asp:UpdatePanel runat="server" ID="UPCommunicationlogForm" ChildrenAsTriggers="true" >
      

      这解决了我的问题,现在我从 gridview 中的 ItemTemplate 生成的编辑和删除按钮在服务器上调用它们各自的方法。

      【讨论】:

        【解决方案3】:

        我添加了一个 OnRowCommand 事件并将此触发器添加到 UpdatePanel:

        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="gvPrList" EventName="RowCommand" />
        </Triggers>
        

        请注意,这是一个异步触发器。

        【讨论】:

          【解决方案4】:

          我遇到了同样的问题,带有 OnClick 的列按钮会导致回发,但 OnClick 方法没有被命中。当我注释掉更新面板时,一切正常。

          我通过在更新面板中为网格添加回发触发器解决了这个问题:

          </ContentTemplate>
             <Triggers>
                 <asp:PostBackTrigger ControlID="uxWebDataGrid" />
             </Triggers>
          </asp:UpdatePanel>
          

          希望这对其他人有帮助!

          【讨论】:

            【解决方案5】:

            我做了以下,它的工作原理

            我用 html 按钮替换 asp 按钮并调用 javascript 方法来触发 Update Panal Load 事件。

            <input id="btnDelete1" type="button" onclick="javascript:DeletePrItem('<%# Eval("ID") %>');" value="Delete" class="button save" style="width: 80px" />
            

            我的 Js:

                function DeletePrItem(_Id) {
                    __doPostBack('<%= uplPanel.ClientID %>', _Id);
                }
            

            我背后的代码:

                protected void uplPanel_Load(object sender, EventArgs e)
                {
                    var arg = Request.Params.Get("__EVENTARGUMENT");
            
                    if (arg != null)
                    {
                        if (arg != "")
                        {
                            string recordId = arg.ToString();
                            //Do deletetion and rebind data grid
            
                }
                 }
            }
            

            【讨论】:

              【解决方案6】:

              这将是代码隐藏中命令的事件处理程序:

              protected void onPrItemCmd(object sender, CommandEventArgs e)
                  {
                      //do whatever you want
                      //probably you will need the "ID" or "CommandArgument":
                      string myArgumentID = e.CommandArgument.ToString();
              
                      uplPanel.Update(); //since the UpdatePanel is set *UpdateMode="Conditional"*
                  }
              

              更新:

              您可能会在单击按钮时进行一些验证。如果是这样,您需要在按钮或链接属性中添加 CausesValidation="false"

              【讨论】:

              • @Nilaa 只是想知道您为什么使用 OnLoad="uplPanel_Load"?你在那个过程中做什么?这是一个非常简单的任务,它没有触发事件非常奇怪。从头开始创建页面并查看它在哪里中断也是一个好主意...
              • 我还有一些调用共享点模型弹出的按钮。使用 __doPostBack('', '');可能是导致我的问题。有什么想法吗?
              • 我尝试使用它并得到异常The Update method can only be called on UpdatePanel with ID 'UpdatePanel1' before Render
              • @vapcguy 尝试用 UpdatePanel1 替换 uplPanel,这是您的更新面板的标识符............
              • @aleafonso UpdatePanel1 我的标识符。 uplPanel 是 OP 的标识符。不管我怎么称呼它就是我所得到的——只是表明它是相同的场景,当你在 .NET 不喜欢的地方调用 .Update() 时会出现错误(比如按钮点击事件)。不过,我设法以与这篇文章无关的方式解决了我的问题。我有一个计时器作为更新我的面板的触发器,我的按钮单击事件启用了我的计时器。我将数据表的.DataBind() 放到了Timer1_Tick() 函数中的gridview 中,没有.Update() 也可以正常工作
              【解决方案7】:

              请将此代码添加到更新面板中。

              </ContentTemplate> 
               <Triggers>
                 <asp:PostBackTrigger ControlID="gvPrList" EventName="Click" />
               </Triggers>
               </asp:UpdatePanel>
              

              【讨论】:

              • 我收到此错误:类型“System.Web.UI.PostBackTrigger”没有名为“EventName”的公共属性。我正在使用 asp.net 3.5
              • protected void Click(object sender, CommandEventArgs e) { } //创建这是一个虚拟事件并尝试
              • 'System.Web.UI.PostBackTrigger' 没有这个属性
              • 如果是 PostBackTrigger,则不需要事件 - 只有 AsyncPostBackTrigger 需要。
              【解决方案8】:

              您需要添加 GridView 的 OnCommand 事件,然后在该事件中像这样处理它:

              OnRowCommand="gvPrList_OnRowCommand" 
              

              或者为单个按钮添加一个点击事件,然后在代码隐藏文件中处理:

              <asp:Button ID="btnEdit" runat="server" OnClick="btnEdit_Click" Text="Edit" CssClass="button save"
                                 OnCommand="onPrItemCmd" CommandName="editRow" CommandArgument='<%#Bind("ID") %>' Style="width: 80px" />
              

              【讨论】:

              • 谢谢。我已经有了 onPrItemCmd 事件的处理程序方法后面的代码。
              • 您是否尝试将onclick 事件处理程序添加到您的按钮,然后检查是否有效???
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-04-04
              • 2019-04-25
              • 1970-01-01
              • 2011-01-31
              • 2014-08-21
              • 1970-01-01
              相关资源
              最近更新 更多