【问题标题】:How to allow sorting in GridView如何允许在 GridView 中进行排序
【发布时间】:2014-06-30 13:55:40
【问题描述】:

我有以下 GirdView,它显示一些文件及其修改日期:

<asp:GridView ID="GridView1" AllowSorting="true" OnSorting="GridView1_Sorting" ClientIDMode="Static" runat="server" AutoGenerateColumns="false" EmptyDataText="No PDF was generated">
    <Columns>
        <asp:BoundField DataField="Text" HeaderText="File Name" SortExpression="FileName" />
        <asp:BoundField DataField="Value" HeaderText="File Date" SortExpression="FileDate" />
        <asp:TemplateField>
            <ItemTemplate>
                <asp:LinkButton ID="lnkDownload" Text="Download" runat="server" 
                    CommandArgument='<%# Container.DataItemIndex %>' 
                    OnClick="DownloadFile" />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:LinkButton ID="lnkView" Text="View in Browser" 
                    CommandArgument='<%# Container.DataItemIndex %>' 
                    OnClientClick="window.document.forms[0].target='blank';" 
                    runat="server" OnClick="ViewFile" />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

我正在使用以下代码填充 GridView:

if (!Page.IsPostBack)
    {
        BindData();
        //MessageBox.Show(files.Count() + ""); // displays the count for the files being displayed
    }

protected void BindData()
{
    try
    {
        filePaths = Directory.GetFiles(@"C:\PDFGenerate");
        files = new List<ListItem>();
        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)
    {
    }
    //MessageBox.Show(files.Count() + ""); // displays the count for the files being displayed
}

我在 GridView 中允许了排序方法,还添加了排序表达式。我正在尝试编写允许排序的 C# 代码,但我不确定我将如何处理它,因为我没有使用 SQL 数据源:

protected void GridView1_Sorting(object server, GridViewSortEventArgs e)
    {
        switch (e.SortExpression)
        {
            case "FileName":
                if (e.SortDirection == SortDirection.Ascending)
                {
                    GridView1.DataSource = Session["fileData"];//DO BY ASCENDING
                    GridView1.DataBind();
                }
                else
                {
                    GridView1.DataSource = Session["fileData"];//DO BY DESCENDING
                    GridView1.DataBind();
                }
                break;
            case "FileDate":
                break;
        }
    }

更新:我是如何让它正常工作的......

protected void Page_Load(object sender, EventArgs e)
    {
        string strDirectory = @"C:\PDFGenerate\";
        try
        {
            if (!Directory.Exists(strDirectory))
            {
                Directory.CreateDirectory(strDirectory);
            }
        }
        catch (Exception ce)
        {
            //tc.Text = "Unable to create directory to save generated PDF files";
        }
        if (!Page.IsPostBack) //loaded first time...
        {
            //MessageBox.Show("Fires from a PAGE REFRESH or FIRST VISIT");
            BindData();
        }
        else //loaded after an event (button click, link click, etc.)
        {
            //MessageBox.Show("Fires from an EVENT");
        }
    }
    protected void BindData()
    {
        try
        {
            filePaths = Directory.GetFiles(@"C:\PDFGenerate");
            files = new List<ListItem>();
            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)
        {
        }
        //MessageBox.Show(files.Count() + ""); // displays the count for the files being displayed
    }
    protected void GridView1_Sorting(object server, GridViewSortEventArgs e)
        {
            DataBind();
            string strSortExpression = e.SortExpression;
            switch (strSortExpression)
            {
                case "FileName":
                    if (e.SortExpression == (string)ViewState["SortColumn"])
                    {
                        // We are resorting the same column, so flip the sort direction
                        e.SortDirection =
                            ((SortDirection)ViewState["SortColumnDirection"] == SortDirection.Ascending) ?
                            SortDirection.Descending : SortDirection.Ascending;
                    }
                    if (e.SortDirection == SortDirection.Ascending)
                    {
                        //MessageBox.Show("ASC");
                        var dataTable = ToDataTable((IList<ListItem>)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
                    {
                        //MessageBox.Show("DESC");
                        var dataTable = ToDataTable((IList<ListItem>)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 "FileDate":
                    if (e.SortExpression == (string)ViewState["SortColumn"])
                    {
                        // We are resorting the same column, so flip the sort direction
                        e.SortDirection =
                            ((SortDirection)ViewState["SortColumnDirection"] == SortDirection.Ascending) ?
                            SortDirection.Descending : SortDirection.Ascending;
                    }
                    if (e.SortDirection == SortDirection.Ascending)
                    {
                        var dataTable = ToDataTable((IList<ListItem>)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<ListItem>)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<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;
        }

【问题讨论】:

  • 对您的数据源进行排序并将其反馈回您的网格。有什么问题?
  • 我更新了我的问题以包括我的数据源是什么。它们是文件夹中的文件。
  • 我更新了我的问题。 GridView 在一列中显示文件名,在另一列中显示来自指定文件夹的文件修改日期。我想让用户使用文件名或文件日期对每一列进行排序。
  • 但在 GridView1_Sorting 事件中分配给 gridview 之前,我没有看到 Session["fileData"] 上发生排序。您是否尝试将 Session["fileData"] 转换为相关类型并使用 LINQ 进行排序,然后分配给 GridView?
  • 我不知道如何实现...

标签: c# asp.net


【解决方案1】:

虽然不建议将逻辑放在视图的代码隐藏中,但您可以使用以下代码来实现:

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&lt;T&gt;

最后,添加以下代码以将会话数据加载到数据表中:

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

【讨论】:

    【解决方案2】:

    要按照我之前回答的讨论中的要求在加载时对代码进行排序,请执行以下操作:

    创建一个名为 sort 的方法:

    public void Sort(IList<ListItem> 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<ListItem>();
            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)
        {
        }
        //MessageBox.Show(files.Count() + ""); // displays the count for the files being displayed
    }
    

    然后,将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"])
                    {
                        // We are resorting the same column, so flip the sort direction
                        e.SortDirection =
                            ((SortDirection)ViewState["SortColumnDirection"] == SortDirection.Ascending) ?
                            SortDirection.Descending : SortDirection.Ascending;
                    }
                    Sort((IList<ListItem>)Session["fileData"], e.SortDirection);
                    ViewState["SortColumn"] = e.SortExpression;
                    ViewState["SortColumnDirection"] = e.SortDirection;
                break;
            }
        }
    

    【讨论】:

    • 谢谢!...文件名和文件日期都可以吗?我希望 FileName 在页面加载时从新到旧排序,用户可以单击 FileName 或 FileDate 进行排序。那是代码在做什么吗?它只是在做文件名。我可以使用 SWITCH 来做这两个...
    • 我做到了...我使用了第二个函数并使用了 SWITCH 来传递它所在的列类型的字符串。谢谢。
    【解决方案3】:

    你必须设置 GridView 属性:

    GridView1.AllowSorting="true"
    

    在代码后面(Page_Load 事件)或页面 html 中:其余部分在 http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.allowsorting%28v=vs.110%29.aspx 中有详细说明

    【讨论】:

    • 我已经添加了属性。
    • 我添加了该属性,但它不起作用,因为我不确定如何为我的目的实现 order 方法。我确实赞成,一旦我从您发布的链接中使用它就会接受。或者,如果其他人提供更多的东西。谢谢。
    猜你喜欢
    • 2011-07-18
    • 2012-10-21
    • 1970-01-01
    • 2012-06-02
    • 2016-12-27
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多