【问题标题】:Gridview loses it's data when command buttons (Edit, Update, Cancel) are clicked单击命令按钮(编辑、更新、取消)时,Gridview 会丢失其数据
【发布时间】:2012-10-26 19:48:01
【问题描述】:

每个人。我正在编写一个相当简单的页面,其中包含一个从 SQLDataSource 获取数据的 GridView,这是我以前做过的。当页面加载时,它会进行初始搜索,显示适合访问页面的人的信息。这很好用。我可以改变搜索词并发出修改后的查询,这很有效。但是,当我单击编辑按钮时,Gridview 消失并且 EmptyDataText 出现。如果我点击按钮重新提交搜索,Gridview 将重新出现在编辑模式中。我可以修改字段并点击更新按钮,然后再次获取 EmptyDataText。重新提交搜索,Gridview 重新出现,更改的字段更新为新值。

我可以捕捉到 OnRowEditing 事件,这表明该按钮有效。我可以捕获紧随其后的 RowDatabound 事件 - Gridview 仍然可见,并且我假设它正在处理标题行。在点击继续时,我得到 EmptyDataText 并且不再看到 RowDataBound 事件。我的假设是它会在第一个数据行中查找数据,但没有找到任何数据,因此会显示文本。

当我重新提交搜索时,我再次看到 RowDataBound 事件,并且在与单击编辑按钮的行对应的事件上,我观察编辑模式显示的预处理 - 这包括从搜索条件 DropDownList 到 EditTemplate DropDownList。在 n + !st Step Into 上,GridView 显示,在编辑模式下具有正确的行。

当我点击更新或取消时,类似的模式也成立。当任何命令按钮被点击时,GridView 似乎正在丢失它与数据的链接,并且需要重新提交搜索以重新建立链接。我已尝试在 PageLoad 和各种事件处理程序中在我能想到的所有点重新绑定网格(重新设置 DataSourceID 字符串,或者重新设置 DataBind() 调用)。但是,我过去做过这种链接和编辑,而不必如此严厉。很明显,我遗漏了一些使这种情况不同的关键步骤,而且可能是相当小的步骤。现在,我只想弄清楚如何让 Gridview 进入编辑模式并重新渲染,而不会在完成 OnRowEditing 后进入编辑模式时丢失它与数据行的链接。有什么想法吗?

这是有问题的 Gridview:

<asp:GridView ID="gvTaskStatus" runat="server" EmptyDataText="No tasks match your search criteria"  
 AllowSorting="true"  Visible="true" AutoGenerateEditButton="true" 
 DataKeyNames="EDA_RequestID"
 CssClass="GenDisplayStyle"  CellPadding="3"
 AutoGenerateColumns="false" Font-Size="X-Small"  

 OnSorted="gvSorted"                    
 OnRowUpdating="gvTask_OnRowUpdating" 
 OnRowUpdated="gvTask_OnRowUpdated" 
 OnRowCancelingEdit="gvTask_OnRowCancelled"  
 OnRowDataBound="gvTaskStatus_RowDataBound" 
 OnRowEditing="gvTaskStatus_OnRowEditing"
 >

<HeaderStyle CssClass="GridHeader" />
<AlternatingRowStyle BackColor="AliceBlue"/>

<Columns>
  <asp:BoundField DataField="EDA_RequestID" HeaderText="Request ID" ReadOnly="true" Visible="false" />
  <asp:BoundField DataField="Requestor" HeaderText="Requestor"  
              SortExpression="Requestor" ReadOnly="true"/>
  <asp:BoundField DataField="ProjectName" HeaderText="Project Name" 
              SortExpression="ProjectName" />
  <asp:BoundField DataField="ChargeNumber" HeaderText="Charge Number"
              SortExpression="ChargeNumber" />

  <asp:TemplateField HeaderText="Assigned To" SortExpression="AssignedTo" >
      <ItemTemplate>
         <asp:Label Text='<%#Eval("AssignedTo")%>' runat="server" ID="ShowAssigned" />
      </ItemTemplate>
      <EditItemTemplate>
         <asp:DropDownList runat="server" ID="EditAssigned" AutoPostBack="False"    
                           OnSelectedIndexChanged="PersonAssigned" >
         </asp:DropDownList>
      </EditItemTemplate>
      </asp:TemplateField>

<asp:BoundField DataField="MEPartNumber" HeaderText="Part Number"  
                SortExpression="MEPartNumber" />
<asp:BoundField DataField="ReceivedDate" HeaderText="Date Submitted"  
             SortExpression="ReceivedDate" ReadOnly="true"/>
    <!-- Some rows, all boundfields, deleted for length  -->        

</Columns>
</asp:GridView>

以及数据来源:

<asp:SqlDataSource ID="EDASource" runat="server" 
        DataSourceMode="DataSet" CancelSelectOnNullParameter="false"    
        ConnectionString="<%$ ConnectionStrings:MECDConnectionString %>" 
        ProviderName="System.Data.SqlClient" OnSelected="SqlDataSelectedEvent" >

     <SelectParameters>
        <asp:ControlParameter Name="MEPNTxt"    ControlID="MEPNTxt"      PropertyName="Text"   Type="String" />
        <asp:ControlParameter Name="CommentsTxt" ControlID="CommentsTxt" PropertyName="Text"   Type="String" />  
        <asp:Parameter Name="AssignedTo" Type="String" />
        <asp:Parameter Name="TopStatus"  Type="String" />
        <asp:Parameter Name="Requestor"  Type="String" />
        <asp:Parameter Name="SubmitDate" Type="String" />
     </SelectParameters>

     <UpdateParameters>
        <asp:Parameter Name="UdEDA_ID"       Type="Int32" />
        <asp:Parameter Name="UdAssignedTo"   Type="String" />
        <asp:Parameter Name="UdActEndDate"   Type="DateTime" />
        <asp:Parameter Name="UdProjectName"  Type="String" />
        <asp:Parameter Name="UdChargeNumber" Type="String" />
        <asp:Parameter Name="UdDatasheetURL" Type="String" />
        <asp:Parameter Name="UdComments"     Type="String" />
        <asp:Parameter Name="UdMEPartNumber" Type="String" />
        <asp:Parameter Name="UdTopStatus"    Type="String" />
        <asp:Parameter Name="UdSymStatus"    Type="String" />
        <asp:Parameter Name="UdSymChecked"   Type="String" />
        <asp:Parameter Name="UdFtpStatus"    Type="String" />
        <asp:Parameter Name="UdFtpChecked"   Type="String" />
        <asp:Parameter Name="UdParamStatus"  Type="String" />
     </UpdateParameters>

   </asp:SqlDataSource>

【问题讨论】:

  • 请出示您的OnRowEditing 代码
  • 目前,OnRowEditing 只是一个没有内容的stub。有一次,我尝试在那里重新绑定 Gridview,但是在此事件完成后,指向数据的链接丢失了,所以我删除了该代码。
  • 好的,解决了。或者至少,按我的意愿工作。我在第一个页面加载时进行初始搜索,并将 SQL Select 命令保存在隐藏字段中。我还将其保存在以后的自定义搜索中。在 PageLoad 例程中,如果加载 回发,我会重新发出最近的 Select 命令,Gridview 会以正确的数据、可见的和所有内容进入编辑模式。为什么我必须做这一切仍然有点令人费解——我以前从来没有做过这个重新选择。不过,感谢大家的所有建议。

标签: asp.net


【解决方案1】:

我已尝试在 PageLoad 和各种事件处理程序处重新绑定我能想到的所有点(重新设置 DataSourceID 字符串,或者发出 DataBind() 调用)。

我怀疑这是你的问题。根据您的描述,听起来您不需要显式重新绑定网格,这样做时您应该期望网格的状态会被重置。我建议删除对 DataBind() 的所有调用或重置 DataSourceID。

【讨论】:

  • 不高兴。 DataSourceID 设置一次,在初始页面加载期间,问题仍然存在。
  • 事实上,我在 gridview 本身中声明了 DataSourceID="EDASource" ,并从代码隐藏中删除了对该属性的任何编程引用,问题仍然存在。进入任何命令按钮状态时都会丢失数据。
  • @Chris SelectParameter 值是如何设置的?
  • 在执行搜索的例程(按钮点击事件)中。
  • 通过调试,您应该确保这些参数值在回发中得到保留。参数值的变化会导致 Grid 自动重新绑定。
【解决方案2】:

页面后面的代码肯定有助于分析问题。

最常见的原因是甚至回发中的数据绑定。 所以请确保您在页面加载中的数据绑定是这样的:

if(!Page.PostBack){
//Your Grid Databinding
}

【讨论】:

  • 我尝试过在 if(!IsPostback) 块内发生初始(也是唯一的)数据绑定,并以声明方式设置 DataSourceID 并且永远不会被代码隐藏。在任何一种情况下,行为都是相同的 - 一切都在正常搜索中工作,但是当单击任何命令按钮(编辑、更新或取消)时,就像没有找到任何行一样。
  • 你能做一个 sql 跟踪 / 使用 sqlProfiler 看看到底叫什么吗?
  • 遗憾的是,我没有分析器访问权限。我确实在 DataSource 处捕获了 OnSelected 事件,并且它上面的断点显示在单击 Edit 时未选择数据源。这是 Gridview 中的东西——我点击了编辑,在 RowEditing 之后,它进入了编辑模式。它遍历它的行,在尝试重新绘制第一行时触发 RowDataBound 事件。然后,它找不到其他行并显示 EmptyDataText。当我重新选择搜索时,它会为每一行触发 RowDataBound 事件,并在编辑模式下显示 Gridview。搜索的是 SQL 命令,而不是存储过程。
  • 1:如果可能的话,我会去 DBA 并要求对特定的存储过程运行跟踪。 2)我会先用前一列或两列缩小网格。我的一个猜测可能是在编辑模式下 DDL 的一些绑定问题可能会导致这种情况。您可以尝试将其更改为只读。这只是一个猜测。
  • Ummm.... 没有存储过程。我可能在上一条评论的最后一行不清楚。我可以尝试删除一些列并尝试制作一些 ReadOnly,但我真的认为这与这些细节无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
相关资源
最近更新 更多