在可编辑的网格视图在其所在的更新面板之后显示后,在可编辑的网格视图中进行更新已由用户显示

时间:2013-03-21 21:41:45

标签: vb.net gridview updatepanel

我一直在搜索论坛并试图解决这个问题几天但是我被卡住了。如果这是一件如此简单和明显的事情,我很遗憾地道歉。虽然我发现了类似于我的问题的帖子,但它们并不完全相同。

以下是我的网络应用程序部分功能的概述:

  1. 显示了一个简单的asp:dropdownlist
  2. 当用户选择一个值时,相应的更新面板可见(这些更新面板在后面的Page_Load代码中可见= false),显示可编辑的网格视图:

    Protected Sub DropDownList1_SelectedIndexChanged(sender As Object, e As EventArgs) If DropDownList1.SelectedItem.Value <> "0" Then If DropDownList1.SelectedValue = "Activate or Inactivate Users" Then UpdatePanel1.Visible = True End If ...

         

         <asp:GridView ID="GridView3" runat="server" AllowSorting="True" AutoGenerateColumns="False" AutoGenerateEditButton="True" DataSourceID="SqlDataSource2">
             <Columns>
                 <asp:BoundField DataField="iMemberId" HeaderText="iMemberId" InsertVisible="False" ReadOnly="True" SortExpression="iMemberId" />
                 <asp:BoundField DataField="sFname" HeaderText="sFname" SortExpression="sFname" />
                 <asp:BoundField DataField="sSname" HeaderText="sSname" SortExpression="sSname" />
                 <asp:BoundField DataField="dDateCreated" HeaderText="dDateCreated" SortExpression="dDateCreated" />
                 <asp:BoundField DataField="sEmailAddress" HeaderText="sEmailAddress" SortExpression="sEmailAddress" />
                 <asp:BoundField DataField="sMobileNo" HeaderText="sMobileNo" SortExpression="sMobileNo" />
                 <asp:CheckBoxField DataField="bActiveMember" HeaderText="bActiveMember" SortExpression="bActiveMember" />
             </Columns>
         </asp:GridView>
         <asp:SqlDataSource ID="SqlDataSource2" Runat="server" ConnectionString="<%$ ConnectionStrings:PTCCHomeTestConnectionString %>" SelectCommand="SELECT * FROM [MemberTable] ORDER BY [sSname]" 
             UpdateCommand="UPDATE MemberTable SET sFname = @sFname, sSname = @sSname, sEmailAddress = @sEmailAddress, sMobileNo =, bActiveMember = WHERE (iMemberId = @iMemberId)">
         <UpdateParameters>
                             <asp:Parameter Name="sFname" />
                             <asp:Parameter Name="sSname" />
                             <asp:Parameter Name="sEmailAddress" />
                             <asp:Parameter Name="iMemberId" />
         </UpdateParameters>
         </asp:SqlDataSource>
    
    </ContentTemplate>
    

  3. 每个gridview的选择和更新查询都经过测试并且运行正常。我已经在一个页面中测试了网格视图,它们都是可见的(并且一切正常,但我希望只有适当的网格视图可见,具体取决于用户从下拉列表中选择哪一个。

    1. 然后,用户应该可以单击所选行上的“编辑”并进行更新。 gridview显示正常,填充正确,但当用户单击行中的编辑(更新)链接时,我收到错误:

    2. “无效的回发或回调参数。使用配置或&lt;%@ Page EnableEventValidation =”true“%&gt;在页面中启用事件验证...

      堆栈追踪:

      [ArgumentException: Invalid postback or callback argument.  Event validation is enabled using  in configuration or  in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.]
         System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument) +144
         System.Web.UI.Control.ValidateEvent(String uniqueID, String eventArgument) +111
         System.Web.UI.WebControls.GridView.RaisePostBackEvent(String eventArgument) +32
         System.Web.UI.WebControls.GridView.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +13
         System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
         System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +9643314
         System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1724
      
      Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.17929"`
      

      我尝试了以下(但仍然是同样的错误):

      我添加了一个Render子,它记录了select和update中的所有值以进行事件验证:

      Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
      
          'override (page) Render and loop over the GridView Rows
          Dim row As GridViewRow
          For Each row In GridView3.Rows
              If (row.RowType = DataControlRowType.DataRow) Then        
                  Page.ClientScript.RegisterForEventValidation(New System.Web.UI.PostBackOptions(Me.GridView3, "Select$" + row.RowIndex.ToString()))
                  Page.ClientScript.RegisterForEventValidation(New System.Web.UI.PostBackOptions(Me.GridView3, "Update$" + row.RowIndex.ToString()))          
              End If   
          Next
      
          MyBase.Render(writer)
      

      ...

      我还尝试重新绑定gridview和datasource:

          If Not (IsPostBack) Then
             SqlDataSource2.DataBind()
             GridView3.DataBind()
          End If
      

      我还试图在Page标签中添加EnableEventValidation =“false”。会发生什么事情我现在可以按下编辑链接,但随后UpdatePanel消失(按照Page_Load),然后当我从下拉列表中选择值时,它再次显示,行在编辑模式下,但是使用空格而不是行的当前价值。

      我还尝试在gridview所在的同一updatePanel之外定义gridview的数据源,但这没有任何区别。

      只是为了确认,如果我没有在Page_Load代码中使UpdatePanels可见= false,那么用户可以看到所有这些,那么gridviews可以正常更新行。这让我觉得问题在于无状态,好像我理解正确,当按下编辑链接时再次调用Page_Load代码并且不再保持dropdownlistvalue,从而使gridview再次显示的updatepanel = visible = false

      那么,还有其他方法可以隐藏更新面板,具体取决于不是Page_Load的下拉列表选项吗?这可能是解决方案的所在吗?

      或者在编辑链接(Page_Load调用)完成后保持下拉列表选择值的另一种方法是什么?

      我认为我在正确的轨道上,但获得一点指导真的很有帮助。

0 个答案:

没有答案