この EntityDataSource にバインドされた GridView があります。
<asp:EntityDataSource ID="lotDetailQuery" runat="server" ViewStateMode="Enabled"
ConnectionString="name=encoreEntities" DefaultContainerName="encoreEntities"
EnableFlattening="False" EntitySetName="lotdetails" Include="lot, lot.salesorder"
Where="false" OrderBy="it.lotdetaildate">
<WhereParameters>
<asp:Parameter Name="OrderNum" Type="String" />
<asp:Parameter Name="BoxNum" Type="String" />
<asp:Parameter Name="SerialNum" Type="String" />
<asp:Parameter Name="InvoiceNum" Type="String" />
<asp:ControlParameter Name="DateFrom" ControlID="txtDateFrom" Type="DateTime" />
<asp:Parameter Name="DateTo" Type="DateTime" />
</WhereParameters>
</asp:EntityDataSource></asp:Content>
コード ビハインドでは、WhereParameters と Where ステートメントの値を設定します。(たとえば、ユーザーが BoxNum JLS001 を検索する場合、Where ステートメントは "it.boxnum = @BoxNum" に設定され、WhereParam BoxNum は JLS001 に設定されます。ユーザーが検索している場合、グリッドビューは正常に機能します。
私が提供した [削除] ボタンを使用して、ユーザーがレコードの 1 つを削除すると、問題が発生します。削除後、GridView.DataBind() でグリッドビューを更新してみます。ポストバックが完了すると、グリッドビューは空になります。
WhereParameters はポストバックを生き延びましたが (BoxNum はまだ JLS001 に設定されています)、Where ステートメントはそうではありませんでした。ポストバック後、このステートメントは、ページが最初に読み込まれたときと同じように「false」に設定されます。
Where ステートメントを非表示のラベルに書き込んでから EntityDataSource にコピーするような手間は別として、ポストバック中に Where ステートメントの値を保持する方法はありますか?
または、EntityFramework で動的クエリを使用するためのより良い方法があるかもしれません。私は SqlDataSources を使用し、それらをストアド プロシージャにアタッチしてパラメーターを渡すことに慣れており、この方法でうまく機能しました。ただし、正しいテーブルをクエリするための SQL クエリのロジックは、ストアド プロシージャにありました。ここで、ロジックはコードビハインドにあります。