2

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

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

当我重新提交搜索时,我再次看到 RowDataBound 事件,并且在与单击编辑按钮的行对应的事件上,我观察编辑模式显示的预处理 - 这包括从搜索条件复制 ItemList 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>
4

2 回答 2

0

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

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

于 2012-10-26T20:04:30.970 回答
0

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

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

if(!Page.PostBack){
//Your Grid Databinding
}
于 2012-10-26T20:55:15.907 回答