グリッドビューを手動で並べ替えてページングしようとしていますが、成功しません。
問題は、ユーザーが並べ替える列をクリックすると、そのページは並べ替えられますが、グリッドビューの背後のデータソース(データビュー)は並べ替えられないことです。したがって、別のページに進むと、それらのソートは失われます。グリッドビューの背後にあるデータソースを実際にソートするソートを探しています。ここに私がこれまで持っているものがあります:
protected void GridView_OnSort(object sender, GridViewSortEventArgs e)
{
String sortExpression = e.SortExpression;
if (GridViewSortDirection == SortDirection.Ascending)
{
DataView myDataView = new DataView(mybll.GetItemsOrdered());
myDataView.Sort = sortExpression + " DESC";
GridView.DataSource = myDataView;
GridView.DataBind();
}
else
{
DataView myDataView = new DataView(mybll.GetItemsOrdered());
myDataView.Sort = sortExpression + " ASC";
GridView.DataSource = myDataView;
GridView.DataBind();
}
}
任意の助けをいただければ幸いです。ありがとう。
並べ替え順序をViewStateに保存します。
private const string ASCENDING = " ASC";
private const string DESCENDING = " DESC";
public SortDirection GridViewSortDirection
{
get
{
if (ViewState["sortDirection"] == null)
ViewState["sortDirection"] = SortDirection.Ascending;
return (SortDirection) ViewState["sortDirection"];
}
set { ViewState["sortDirection"] = value; }
}
protected void GridView_Sorting(object sender, GridViewSortEventArgs e)
{
string sortExpression = e.SortExpression;
if (GridViewSortDirection == SortDirection.Ascending)
{
GridViewSortDirection = SortDirection.Descending;
SortGridView(sortExpression, DESCENDING);
}
else
{
GridViewSortDirection = SortDirection.Ascending;
SortGridView(sortExpression, ASCENDING);
}
}
private void SortGridView(string sortExpression,string direction)
{
// You can cache the DataTable for improving performance
DataTable dt = GetData().Tables[0];
DataView dv = new DataView(dt);
dv.Sort = sortExpression + direction;
GridView1.DataSource = dv;
GridView1.DataBind();
}
既存のソート機能を使用したくないのはなぜですか?いつでもカスタマイズできます。
GridView Webサーバーコントロールでのデータの並べ替え MSDN
カスタマイズの例を次に示します。
<asp:GridView
ID="GridView1" runat="server" AutoGenerateColumns="false" AllowSorting="True" onsorting="GridView1_Sorting" EnableViewState="true">
<Columns>
<asp:BoundField DataField="bookid" HeaderText="BOOK ID"SortExpression="bookid" />
<asp:BoundField DataField="bookname" HeaderText="BOOK NAME" />
<asp:BoundField DataField="writer" HeaderText="WRITER" />
<asp:BoundField DataField="totalbook" HeaderText="TOTALBOOK" SortExpression="totalbook" />
<asp:BoundField DataField="availablebook" HeaderText="AVAILABLE BOOK" />
</Columns>
</asp:GridView>
コードビハインド:
protected void Page_Load(object sender, EventArgs e) {
if (!IsPostBack) {
string query = "SELECT * FROM book";
DataTable DT = new DataTable();
SqlDataAdapter DA = new SqlDataAdapter(query, sqlCon);
DA.Fill(DT);
GridView1.DataSource = DT;
GridView1.DataBind();
}
}
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) {
string query = "SELECT * FROM book";
DataTable DT = new DataTable();
SqlDataAdapter DA = new SqlDataAdapter(query, sqlCon);
DA.Fill(DT);
GridView1.DataSource = DT;
GridView1.DataBind();
if (DT != null) {
DataView dataView = new DataView(DT);
dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);
GridView1.DataSource = dataView;
GridView1.DataBind();
}
}
private string GridViewSortDirection {
get { return ViewState["SortDirection"] as string ?? "DESC"; }
set { ViewState["SortDirection"] = value; }
}
private string ConvertSortDirectionToSql(SortDirection sortDirection) {
switch (GridViewSortDirection) {
case "ASC":
GridViewSortDirection = "DESC";
break;
case "DESC":
GridViewSortDirection = "ASC";
break;
}
return GridViewSortDirection;
}
}
Tarkusの答えはうまくいきます。ただし、VIEWSTATEをSESSIONに置き換えることをお勧めします。
現在のページのVIEWSTATEは、現在のページがそれ自体にポストバックしている間のみ機能し、ユーザーが別のページにリダイレクトされると消えます。 SESSIONは、現在のページのポストバック以外にもソート順序を保持します。それは、セッションの全期間にわたって持続します。これは、ユーザーが他のページに移動できることを意味し、指定されたページに戻ったときに、最後に使用した並べ替え順序がまだ残っています。これは通常、より便利です。
ユーザープロファイルの保持など、他の方法もあります。
ViewStateの非常に良い説明と、Webページのライフサイクルでの動作については、この記事をお勧めします。 https://msdn.Microsoft.com/en-us/library/ms972976.aspx
VIEWSTATE、SESSION、および変数を保持する他の方法の違いを理解するには、この記事をお勧めします。 https://msdn.Microsoft.com/en-us/library/75x4ha6s.aspx
私ははるかに簡単な方法を見つけました。これにより、標準のグリッドビューの組み込みのソート/ページングを引き続き使用できます...
2つのラベルを作成します。 visible = falseに設定します。私は私のlblSort1とlblSortDirection1を呼び出しました
次に、2つの単純なイベントをコーディングします。非表示ラベルのテキストに書き込むページソートと、それらを使用するページインデックスの変更...
Private Sub gridview_Sorting(sender As Object, e As GridViewSortEventArgs) Handles gridview.Sorting
lblSort1.Text = e.SortExpression
lblSortDirection1.Text = e.SortDirection
End Sub
Private Sub gridview_PageIndexChanging(sender As Object, e As GridViewPageEventArgs) Handles gridview.PageIndexChanging
gridview.Sort(lblSort1.Text, CInt(lblSortDirection1.Text))
End Sub
これはグローバル変数を使用するよりも少しゆるいですが、私は特にグローバル変数が信頼できないことをaspで発見しました...
より簡単な方法...:
Dim dt As DataTable = DirectCast(GridView1.DataSource, DataTable)
Dim dv As New DataView(dt)
If GridView1.Attributes("dir") = SortDirection.Ascending Then
dv.Sort = e.SortExpression & " DESC"
GridView1.Attributes("dir") = SortDirection.Descending
Else
GridView1.Attributes("dir") = SortDirection.Ascending
dv.Sort = e.SortExpression & " ASC"
End If
GridView1.DataSource = dv
GridView1.DataBind()