2

みんな。以前に行った SQLDataSource からデータを取得する GridView を使用して、かなり単純なページを作成しています。ページが読み込まれると、ページにアクセスする人に適した情報を表示する初期検索が行われます。それはうまくいきます。検索用語を変更して、変更したクエリを発行できますが、それは機能します。ただし、[編集] ボタンをクリックすると、Gridview が消えて EmptyDataText が表示されます。ボタンを押して検索を再送信すると、Gridview が編集モードで再表示されます。フィールドを変更して [更新] ボタンをクリックすると、再び EmptyDataText を取得できます。検索を再送信すると、Gridview が再表示され、変更されたフィールドが新しい値に更新されます。

ボタンが機能していることを示す OnRowEditing イベントをキャッチできます。すぐ後に続く RowDatabound イベントをキャッチできます。Gridview はまだ表示されており、ヘッダー行を処理していると想定しています。[続行] をクリックすると、EmptyDataText が取得され、RowDataBound イベントが再び表示されません。私の仮説は、最初のデータ行のデータを探しに行き、何も見つからないため、テキストが表示されるというものです。

検索を再送信すると、RowDataBound イベントが再び表示され、[編集] ボタンがクリックされた行に対応するイベントで、編集モード表示の前処理が監視されます。これには、検索基準からの ItemList のコピーが含まれます。 DropDownList を EditTemplate DropDownList に。n + !st ステップ インで、GridView が表示され、編集モードで正しい行が表示されます。

Update または Cancel を押した場合も、同様のパターンが適用されます。いずれかのコマンド ボタンが押されたときに 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

ページの背後にあるコードは、問題の分析に役立つはずです。

最も一般的な理由は、ポストバックでもデータバインディングです。したがって、ページロードのデータバインディングが次のようになっていることを確認してください。

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

PageLoad およびさまざまなイベント ハンドラーで、考えられるすべてのポイント (DataSourceID 文字列を再設定するか、DataBind() 呼び出しを発行する) でグリッドを再バインドしようとしました。

これはあなたの問題だと思います。あなたの説明に基づいて、グリッドを明示的に再バインドする必要があるようには思えません。そうするときは、グリッドの状態がリセットされることを期待する必要があります。DataBind() へのすべての呼び出しを削除するか、DataSourceID をリセットすることをお勧めします。

于 2012-10-26T20:04:30.970 に答える