asp.net ListView Сортировка с использованием DataBind - PullRequest
2 голосов
/ 28 сентября 2011

Сортировка списка по заголовкам столбцов в LayoutTemplate

Я могу отсортировать базовое представление списка с помощью asp: SqlDataSource и установить свойство представления списка DataSourceID, указав его для идентификатора asp: SqlDataSource. У меня возникла проблема при сортировке, когда не используется 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>

Пример привязки данных:

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

Оба примера кода заполняют представление списка, но второй пример привязки данных не работает для сортировки. В первом примере сортировка работает только с добавленным asp: LinkButton в LayoutTemplate, добавляющим CommandName = "sort" и устанавливающим CommandArugment = "ColumnName", но во втором примере она не работает.

Может кто-нибудь объяснить, почему и как заставить работать сортировку, используя код метода DataBind?

Спасибо!

Ответы [ 3 ]

9 голосов
/ 02 октября 2011

Я решил свою проблему.

Я добавил событие для обработки сортировки. Событие захватывает имя команды (столбец «Данные») и передает его и направление сортировки в функцию, которая выполнит еще один вызов в базу данных, отсортирует возвращенные результаты и выполнит повторную привязку к представлению списка.

Мне пришлось создать состояние просмотра, чтобы оно содержало направление сортировки представления списка, потому что по какой-то причине обработчик события сортировки продолжал говорить, что направление сортировки возрастало.

Front End

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

Back End

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();
    }
}
0 голосов
/ 28 сентября 2011

Потому что в зависимости от выражения сортировки (которое вы определили в вашей разметке) SqlDataSource, скорее всего, сделает что-то , например , это (я не уверен, что это точно , что он делает)для вас за кадром:

Expression<Func<DataRow,object>> myExpression = row => row["SortExpressionYouDefinedForTheColumn"];
IEnumerable<DataRow> ex = ds.Tables[0].AsEnumerable().OrderBy(myExpression.Compile());

Или SqlDataSource может использовать DataView для сортировки DataTable.

SqlDataSource может сделать это, потому что по умолчанию он использует DataSetдля сохранения результирующего набора ( или так говорится в документации ):

Режим поиска данных определяет, как элемент управления SqlDataSource извлекает данные из базовой базы данных.

Когда для свойства DataSourceMode установлено значение DataSet, данные загружаются в объект DataSet и сохраняются в памяти на сервере.Это позволяет создавать сценарии, в которых элементы управления пользовательского интерфейса, такие как GridView, предлагают функции сортировки, фильтрации и разбиения на страницы.

Поскольку вы решили связать вручную с набором данных, вам нужно сделать «магию» самостоятельно;другими словами, вы обрабатываете команду OnSort, получаете выражение сортировки, снова получаете ваш источник данных (как бы вы это ни делали, из Session или снова вызывая базу данных) и выполняете сортировку аналогично линиям, показанным выше, и повторно привязываетесь к вашему Gridview..

0 голосов
/ 28 сентября 2011

Полагаю, вы можете попытаться добавить обработчик для события ListView Sorting.Там вам дан столбец сортировки и порядок сортировки в аргументах события.Это может быть легко использовано для создания определенного запроса и привязки его к списку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...