カスタムDataSourceを使用している場合、ASP.NET GridViewの列を並べ替える方法は?
-
02-07-2019 - |
質問
GridViewを取得して、カスタムSqlDataSourceを使用しているときにユーザーがデータの列をソートできるようにすることはできません。
HTML内のASP参照のコードが最小限のGridViewがあります:
<asp:GridView id="grid" runat="server" AutoGenerateColumns="False" AllowSorting="True">
</asp:GridView>
コードビハインドで、動的に作成されたSqlDataSourceをアタッチします(含まれる列は常に同じではないため、作成に使用されるSQLは実行時に構築されます)。例:
列を設定します...
BoundField column = new BoundField();
column.DataField = columnName;
column.HeaderText = "Heading";
column.SortExpression = columnName;
grid.Columns.Add(column);
データソース...
SqlDataSource dataSource = new SqlDataSource(
"System.Data.SqlClient",
connectionString,
generatedSelectCommand);
次にgridview ...
grid.DataSource = dataSource;
grid.DataKeyNames = mylistOfKeys;
grid.DataBind();
現時点では、列データを並べ替えるとユーザーが期待するときに列見出しをクリックしても何も起こりません。誰も私が欠けているものはありますか?
これを行うより良い方法がある場合、これは私にとって厄介に見えるので便利です!
解決
最初にイベントを追加する必要があります:
<asp:GridView AllowSorting="True" OnSorting="gvName_Sorting" ...
そのイベントは次のようになります:
protected void gvName_Sorting( object sender, GridViewSortEventArgs e )
{
...
//rebind gridview
}
基本的にデータを再度取得する必要があります。
ごちゃごちゃしていて、より良い方法があります:ASP.Net MVC
残念ながら、これは大幅に異なるページモデルです。
他のヒント
SortingハンドラーでDataBind()を呼び出す前に、datasource.SelectCommandを再割り当てすることもできます。このようなもの:
protected void gvItems_Sorting(object sender, GridViewSortEventArgs e)
{
GridView gv = (GridView)sender;
SqlDataSource ds = (SqlDataSource)gv.DataSource;
ds.SelectCommand = ds.SelectCommand + " order by "
+ e.SortExpression + " " + GetSortDirection(e.SortDirection);
gvItems.DataSource = ds;
gvItems.DataBind();
}
string GetSortDirection(string sSortDirCmd)
{
string sSortDir;
if ((SortDirection.Ascending == sSortDirCmd))
{
sSortDir = "asc";
}
else
{
sSortDir = "desc";
}
return sSortDir;
}
このヘルプを願っています。実装するために追加のヘルプが必要な場合はお知らせください。
お楽しみください
これについてはわかりませんが、標準のSqlDataSourceを使用し、そのフィールドに従って並べ替えるフィールドをクリックすると、SqlDataSourceにデータが再度入力され、グリッドに再バインドされます。したがって、ソートはクライアント側では行われず、SQLDataSourceのselectmethodがDataReaderでない場合にのみ実行できます。
並べ替えイベントを処理するとき、SqlDataSourceを再作成し、GridViewに再バインドしますか?使用するgeneratedSelectCommandにソートフィールドと方向を設定できますか?または、SQLDataSourceのSortParameterNameプロパティに配置しますか?
SqlDataSourceをグリッドにリバウンドする必要があることは絶対に確信しています。その場で作成するため、再度データを入力する必要があります。
絶対に遅刻するより良いですか
基本的に正しいキースの提案に対するいくつかの追加。
真実は、gridView_Sortingイベントでのソートを処理する必要があるということです。 たとえば、Page_Loadイベントのように、以前にGridViewをDataBind()する必要はありません。そこで、.DataBind()の代わりにGridView.Sort()メソッドのみを呼び出す必要があります。方法は次のとおりです。
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
Me.gridView.Sort(Request.QueryString("sortExpression"), Request.QueryString("sortDirection"))
End If
End Sub
次に、gridView_Sortingイベントを見てみましょう。
そこで、データソースを適切なソートにプッシュする必要があります。 GridView自体はそれを処理しません(少なくともこの場合)。
Protected Sub gridView_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles gridView.Sorting
If IsPostBack Then
e.Cancel = True
Dim sortDir As SortDirection = SortDirection.Ascending
If e.SortExpression = Me.Q_SortExpression And Me.Q_SortDirection = SortDirection.Ascending Then
sortDir = SortDirection.Descending
End If
RedirectMe(e.SortExpression, sortDir)
Else
Dim sortExpr As String = e.SortExpression + " " + IIf(e.SortDirection = SortDirection.Ascending, "ASC", "DESC")
Dim dv As System.Data.DataView = Me.dsrcView.Select(New DataSourceSelectArguments(sortExpr))
Me.gridView.DataSource = dv
Me.gridView.DataBind()
End If
End Sub
ソートパラメータをストアドプロシージャに渡すようなデータソースのソート機能をコーディングする必要はありません。ソートはすべて上記のコードで行われます。
さらに、gridView.EnableViewStateをFalseに切り替えると、ネットワークトラフィックおよびブラウザのページが非常に明るくなります。ページがポストバックされるたびにグリッドが完全に再作成されるため、これを行うことができます。
良い一日を!
マーティン