如何在GridView中允许排序

17 浏览
0 Comments

如何在GridView中允许排序

我有一个GridView,用于显示一些文件及其修改日期:

CommandArgument='<%# Container.DataItemIndex %>'

OnClick="DownloadFile" />

CommandArgument='<%# Container.DataItemIndex %>'

OnClientClick="window.document.forms[0].target='blank';"

runat="server" OnClick="ViewFile" />

我使用以下代码填充GridView:

if (!Page.IsPostBack)
{
    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()));
        }
        GridView1.DataSource = files;
        GridView1.DataBind();
        Session["fileData"] = files;
    }
    catch (Exception ce)
    {
    }
}

我允许在GridView中进行排序,并添加了排序表达式。我试图编写C#代码来实现排序,但我不确定如何处理,因为我没有使用SQL数据源:

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;
}

0
0 Comments

问题出现的原因是没有设置GridView的AllowSorting属性为true。解决方法是在代码中或者页面中设置GridView1.AllowSorting="true"。具体的细节可以参考链接http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.allowsorting%28v=vs.110%29.aspx。原作者已经添加了这个属性,但是没有生效,可能是因为不清楚如何实现排序方法。作者表示会在链接提供的方法生效后点赞并接受答案,如果有其他更好的解决方法也会感谢。

0
0 Comments

如何在GridView中实现排序功能

在前一个回答中的讨论中,有人要求在加载时对代码进行排序。要实现这个功能,请按照以下步骤进行操作:

首先创建一个名为sort的方法:

public void Sort(IList items, 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传递了一个字符串来表示列的类型。谢谢。

0
0 Comments

如何在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;

}

0