如何在GridView中允许排序
如何在GridView中允许排序
我有一个GridView,用于显示一些文件及其修改日期:
CommandArgument='<%# Container.DataItemIndex %>' OnClick="DownloadFile" /> CommandArgument='<%# Container.DataItemIndex %>' OnClientClick="window.document.forms[0].target='blank';" runat="server" OnClick="ViewFile" /> 我使用以下代码填充GridView:
我允许在GridView中进行排序,并添加了排序表达式。我试图编写C#代码来实现排序,但我不确定如何处理,因为我没有使用SQL数据源:if (!Page.IsPostBack)
{
BindData();
}
protected void BindData()
{
try
{
filePaths = Directory.GetFiles(@"C:\PDFGenerate");
files = new List
protected void GridView1_Sorting(object server, GridViewSortEventArgs e) { switch (e.SortExpression) { case "文件名": if (e.SortDirection == SortDirection.Ascending) { GridView1.DataSource = Session["fileData"];//按升序排序 GridView1.DataBind(); } else { GridView1.DataSource = Session["fileData"];//按降序排序 GridView1.DataBind(); } break; case "文件日期": break; } }
更新:我如何使其正常工作...
protected void Page_Load(object sender, EventArgs e) { string strDirectory = @"C:\PDFGenerate\"; try { if (!Directory.Exists(strDirectory)) { Directory.CreateDirectory(strDirectory); } } catch (Exception ce) { } if (!Page.IsPostBack) //第一次加载... { BindData(); } else //在事件后加载(按钮点击,链接点击等) { } } protected void BindData() { try { filePaths = Directory.GetFiles(@"C:\PDFGenerate"); files = new List(); foreach (string filePath in filePaths) { files.Add(new ListItem(Path.GetFileName(filePath), File.GetLastWriteTime(filePath).ToString())); } GridView1.DataSource = files; GridView1.DataBind(); Session["fileData"] = files; } catch (Exception ce) { } } protected void GridView1_Sorting(object server, GridViewSortEventArgs e) { DataBind(); string strSortExpression = e.SortExpression; switch (strSortExpression) { case "文件名": if (e.SortExpression == (string)ViewState["SortColumn"]) { e.SortDirection = ((SortDirection)ViewState["SortColumnDirection"] == SortDirection.Ascending) ? SortDirection.Descending : SortDirection.Ascending; } if (e.SortDirection == SortDirection.Ascending) { var dataTable = ToDataTable((IList )Session["fileData"]); var dataView = new DataView(dataTable); dataView.Sort = string.Format("{0} {1}", "Text", e.SortDirection == SortDirection.Ascending ? "ASC" : "DESC"); GridView1.DataSource = dataView; GridView1.DataBind(); } else { var dataTable = ToDataTable((IList )Session["fileData"]); var dataView = new DataView(dataTable); dataView.Sort = string.Format("{0} {1}", "Text", e.SortDirection == SortDirection.Descending ? "DESC" : "ASC"); GridView1.DataSource = dataView; GridView1.DataBind(); } ViewState["SortColumn"] = e.SortExpression; ViewState["SortColumnDirection"] = e.SortDirection; break; case "文件日期": if (e.SortExpression == (string)ViewState["SortColumn"]) { e.SortDirection = ((SortDirection)ViewState["SortColumnDirection"] == SortDirection.Ascending) ? SortDirection.Descending : SortDirection.Ascending; } if (e.SortDirection == SortDirection.Ascending) { var dataTable = ToDataTable((IList )Session["fileData"]); var dataView = new DataView(dataTable); dataView.Sort = string.Format("{0} {1}", "Value", e.SortDirection == SortDirection.Ascending ? "ASC" : "DESC"); GridView1.DataSource = dataView; GridView1.DataBind(); } else { var dataTable = ToDataTable((IList )Session["fileData"]); var dataView = new DataView(dataTable); dataView.Sort = string.Format("{0} {1}", "Value", e.SortDirection == SortDirection.Descending ? "DESC" : "ASC"); GridView1.DataSource = dataView; GridView1.DataBind(); } ViewState["SortColumn"] = e.SortExpression; ViewState["SortColumnDirection"] = e.SortDirection; break; } } public DataTable ToDataTable(IList data) { var table = new DataTable(); table.Columns.Add("Value", typeof(string)); table.Columns.Add("Text", typeof(string)); foreach (var item in data) { var row = table.NewRow(); row["Value"] = item.Value; row["Text"] = item.Text; table.Rows.Add(row); } return table; }
如何在GridView中实现排序功能
在前一个回答中的讨论中,有人要求在加载时对代码进行排序。要实现这个功能,请按照以下步骤进行操作:
首先创建一个名为sort的方法:
public void Sort(IListitems, SortDirection direction) { var dataTable = ToDataTable(items); var dataView = new DataView(dataTable); dataView.Sort = string.Format("{0} {1}", "Text", direction == SortDirection.Ascending ? "ASC" : "DESC"); GridView1.DataSource = dataView; GridView1.DataBind(); }
然后修改BindData方法的实现:
protected void BindData() { try { filePaths = Directory.GetFiles(@"C:\PDFGenerate"); files = new List(); foreach (string filePath in filePaths) { files.Add(new ListItem(Path.GetFileName(filePath), File.GetLastWriteTime(filePath).ToString())); } Session["fileData"] = files; Sort(files, SortDirection.Descending); } catch (Exception ce) { } }
接下来,修改GridView1_Sorting方法:
protected void GridView1_Sorting(object server, GridViewSortEventArgs e) { string strSortExpression = e.SortExpression; switch (strSortExpression) { case "FileName": case "FileDate": if (e.SortExpression == (string)ViewState["SortColumn"]) { e.SortDirection = ((SortDirection)ViewState["SortColumnDirection"] == SortDirection.Ascending) ? SortDirection.Descending : SortDirection.Ascending; } Sort((IList)Session["fileData"], e.SortDirection); ViewState["SortColumn"] = e.SortExpression; ViewState["SortColumnDirection"] = e.SortDirection; break; } }
感谢!...这将对FileName和FileDate两列都起作用吗?我希望FileName在页面加载时按照从新到旧的顺序排序,而用户可以点击FileName或FileDate进行排序。这段代码是这样做的吗?它只对FileName起作用。我可以使用SWITCH来同时对两列进行排序...
我已经做到了...我使用了第二个函数,并使用SWITCH传递了一个字符串来表示列的类型。谢谢。
如何在GridView中允许排序
在GridView中允许排序的需求可能会出现,尽管在视图的代码后端中放置逻辑是不建议的,但可以通过以下代码实现:
protected void GridView1_Sorting(object server, GridViewSortEventArgs e)
{
switch (e.SortExpression)
{
case "FileName":
var dataTable = ToDataTable((IList<ListItem>)Session["fileData"]);
var dataView = new DataView(dataTable);
dataView.Sort = string.Format("{0} {1}",
e.SortExpression,
e.SortDirection == SortDirection.Ascending
? "ASC" : "DESC");
GridView1.DataSource = dataView;
GridView1.DataBind();
case "FileDate":
break;
}
}
此外,确保集合中的项实现了System.IComparable<T>
接口。
最后,将以下代码添加到加载会话数据到dataTable的方法中:
public DataTable ToDataTable(IList<ListItem> data)
{
var table = new DataTable();
table.Columns.Add("Value", typeof(string));
table.Columns.Add("Text", typeof(string));
foreach (var item in data)
{
var row = table.NewRow();
row["Value"] = item.Value;
row["Text"] = item.Text;
table.Rows.Add(row);
}
return table;
}