asp.net ListView 使用 DataBind 排序

标签 asp.net data-binding listview sorting

使用 LayoutTemplate 中的列标题对 ListView 进行排序

我能够使用 asp:SqlDataSource 对基本 ListView 进行排序,并通过将 ListView 属性 DataSourceID 指向 asp:SqlDataSource ID 来设置它。在不使用 asp:SqlDataSource 和仅使用后面代码中的 DataBinding 时,我在排序时遇到问题。

SqlDataSource 示例:

<asp:ListView ID="ContactsListView" DataSourceID="ContactsDataSource" runat="server">
    <LayoutTemplate>
        <table width="640px" runat="server">
            <tr class="header" align="center" runat="server">
                <td>
                    <asp:LinkButton runat="server" ID="SortByFirstNameButton" CommandName="Sort" Text="First Name" CommandArgument="FirstName" />
    </LayoutTemplate>
    ....
</asp:ListView>

<asp:SqlDataSource ID="ContactsDataSource" runat="server" 
    ConnectionString="<%$ ConnectionStrings:MainConnString %>"
    SelectCommand="SELECT * FROM TableName">
</asp:SqlDataSource>

数据绑定(bind)示例:

<asp:ListView ID="ContactsListView" DataSourceID="ContactsDataSource" runat="server">
    <LayoutTemplate>
        <table width="640px" runat="server">
            <tr class="header" align="center" runat="server">
                <td>
                    <asp:LinkButton runat="server" ID="SortByFirstNameButton" CommandName="Sort" Text="First Name" CommandArgument="FirstName" />
    </LayoutTemplate>
    ....
</asp:ListView>

protected void Page_Load(object sender, EventArgs e)
{
    String SQL = "SELECT * FROM Customer";
    SqlDataAdapter da= new SqlDataAdapter(SQL, ConnStr);
    DataSet ds = new DataSet();
    da.Fill(ds);

    ContactsListView.DataSource = ds.Tables[0];
    ContactsListView.DataBind();
}

两个代码示例都填充了 ListView ,但第二个示例数据绑定(bind)不适用于排序。对于第一个示例,排序仅适用于 LayoutTemplate 中添加的 asp:LinkBut​​ton 添加 CommandName="sort"并设置 CommandArugment="ColumnName",但不适用于第二个示例。

任何人都可以解释为什么以及如何使用 DataBind 方法背后的代码进行排序吗?

谢谢!

最佳答案

我解决了我的问题。

我添加了一个事件来处理排序。该事件获取命令名称(数据列)并将其和排序方向传递给一个函数,该函数将再次调用数据库对返回的结果进行排序并重新绑定(bind)到 ListView 。

我必须创建一个 View 状态来保存 ListView 排序方向,因为出于某种原因,onsorting 事件处理程序一直说排序方向是升序的。

前端

<asp:ListView ID="ContactsListView" OnSorting="ContactsListView_Sorting" runat="server">
    <LayoutTemplate>
        <table width="640px" runat="server">
            <tr class="header" align="center" runat="server">
                <td>
                    <asp:LinkButton runat="server" ID="SortByFirstNameButton" CommandName="Sort" Text="First Name" CommandArgument="FirstName" />
    </LayoutTemplate>
    ....
</asp:ListView>

后端

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        BindContacts(string.Empty);
    }
}

protected SortDirection ListViewSortDirection
{
    get
    {
        if (ViewState["sortDirection"] == null)
            ViewState["sortDirection"] = SortDirection.Ascending;
        return (SortDirection)ViewState["sortDirection"];
    }
    set { ViewState["sortDirection"] = value; }
}

protected void ContactsListView_Sorting(Object sender, ListViewSortEventArgs e)
{
    BindContacts(e.SortExpression + " " + ListViewSortDirection.ToString());

    // Check the sort direction to set the image URL accordingly.
    string imgUrl;
    if (ListViewSortDirection == SortDirection.Ascending)
        ListViewSortDirection = SortDirection.Descending;
    else
        ListViewSortDirection = SortDirection.Ascending;
}

private void BindContacts(string sortExpression)
{
    sortExpression = sortExpression.Replace("Ascending", "ASC");
    sortExpression = sortExpression.Replace("Descending", "DESC");
    using (SqlConnection conn = new SqlConnection(_connStr))
    {
        conn.Open();
        using (SqlDataAdapter dAd = new SqlDataAdapter("SELECT * FROM Customer", conn))
        {
            DataTable dTable = new DataTable();
            dAd.Fill(dTable);
            // Sort now
            dTable.DefaultView.Sort = sortExpression;
            // Bind data now
            ContactsListView.DataSource = dTable;
            ContactsListView.DataBind();
        }
        conn.Close();
    }
}

关于asp.net ListView 使用 DataBind 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7586332/

相关文章:

c# - 错误 : Incorrect syntax near '14'

c# - 我们可以在 web.config 中为 SSO 使用多个联合配置吗?

javascript - 使用 javascript 拖放

c# - 使用 `ElementName` 的 WPF 绑定(bind)失败,但在 Path 属性中指定 ElementName 有效吗?

xaml - 与 DispatcherTimer 相关的绑定(bind)问题

c# - ListView 未在 asp.net 中显示

用于大型数据集的 Android ListView

c# - 用户持久性 : asp. 网络缓存:

javascript - Angular : Getting error while using ng-option

android - 自定义 ListView 不响应click事件