Действительно ли возможно сделать пользовательский вид на GridView

Я должен отсортировать GridView (Не DataGridView, это не то же самое), который нуждается в сложном виде, и я не знаю, как он может быть сделан. У меня есть два столбца, один содержащий дату и другого содержащего приоритет.

Если дата меньше или равна сегодняшней дате. Я хочу заказать приоритетом сначала затем по дате. Если дата больше, чем сегодняшняя дата, я хочу заказать по дате сначала, то приоритетом.

Предположим, что totay является 2010 13 января, некоторые данные приказали, чтобы этот путь мог быть похожим на них

   date       priority  Explanation
-----------   --------  --------------------------------------------
2010-jan-13      3      This comes first because it has the higer priority of all items whith a date <= today
2010-jan-12      2      Since this items and the next have the same priority they're ordered by date
2010-jan-13      2
2010-jan-14      5      This item and the followings have date > today, so they are ordered by date then by priority.
2010-jan-14      0
2010-jan-15      5
2010-jan-16      5

Там должен так или иначе отсортировать представление сетки вручную или путем передачи сравнить функтора?

редактирование: источником данных является DataTable.

7
задан Mathieu Pagé 18 January 2010 в 15:02
поделиться

4 ответа

Вам необходимо сортировать источник данных, а не GRIDVIEW. (Расскажите нам свой источник данных, и мы можем помочь. Это DataTable, SqldataSource, бизнес-объекты?)

из Сортировка данных в управлении веб-сервером GridView AT http: // msdn. Microsoft.com/en-us/library/hwf94875.aspx.

Пользовательская сортировка

Если поведение по умолчанию не адекватно для ваших требований, вы можете настроить поведение сортировки сетки. Основная техника для пользовательской сортировки состоит в том, чтобы обработать событие сортировки. В обработчике вы можете сделать следующее:

  • Настройте выражение сортировки, которое передается в управление источником данных. По умолчанию выражение сортировки - это имя одного столбца. Вы можете изменить выражение сортировки в обработчике событий. Например, если вы хотите отсортировать по двум столбам, вы можете создать выражение сортировки, которое включает в себя оба. Затем вы можете пройти измененное выражение сортировки в контроль источника данных. Для получения дополнительной информации см. GridViewsorteventargs .. ::. Сортиверное свойство.

  • Создайте свою собственную логику сортировки. Например, если вы работаете с источником данных, который не поддерживает сортировку, Вы можете выполнить сортировку в собственном коде, а затем связывать сетку к отсортированным данным.

Пример сортировки (не тестировал и не использует linq [нарочно])

Dim oDataSet As DataSet = GatherDataSet()
Dim oDataTable As DataTable = oDataSet.Tables(0)
Dim oSort1 As New DataView(oDataTable, "Date > #2010/01/13#", "Date, Priority", DataViewRowState.CurrentRows)
Dim oSort2 As New DataView(oDataTable, "Date <= #2010/01/13#", "Priority, Date", DataViewRowState.CurrentRows)
Dim oGridDataTable As DataTable
oGridDataTable = oSort1.ToTable
oGridDataTable.Merge(oSort2.ToTable)

oGridView.DataSource = oGridDataTable

'...
'you can then merge any changes back into the data set, if needed
oDataSet.Merge(oGridDataTable)
3
ответ дан 7 December 2019 в 18:43
поделиться

Salut Mathieu,

Предполагая, что вы используете DataSource, и каждый элемент представляет собой класс (вместо того, чтобы сказать, что DataRow) вы можете реализовать Imparable для вашего класса. Он добавляет метод сравнения, в котором вы решаете, как каждый элемент сравнивается друг с другом.

class DatePriority: IComparable
{
    private DateTime date;
    public DateTime Date
    {
        get { return date; }
    }
    private int priority;
    public int Priority
    {
        get { return priority; }
    }

    public DatePriority(DateTime date, int priority)
    {
        this.date = date;
        this.priority = priority;
    }

    public int CompareTo(object obj)
    {
        if (obj is DatePriority)
        {
            DatePriority comparedDatePriority = obj as DatePriority;

            // Comparison logic
            // If the compared elements are today or before today, order by priority in descending order. Same priorities are ordered by date in ascending order
            // If the compared elements are for the future, order by date in ascending order. Same dates are order by priority in descending order
            if ((this.Date <= DateTime.Today && comparedDatePriority.Date <= DateTime.Today))
            {
                if (Priority == comparedDatePriority.Priority)
                    return Date.CompareTo(comparedDatePriority.Date);
                else
                    return -Priority.CompareTo(comparedDatePriority.Priority);
            }
            else
            {                    
                if (Date == comparedDatePriority.date)
                    return -Priority.CompareTo(comparedDatePriority.Priority); // Descending order
                else
                    return Date.CompareTo(comparedDatePriority.Date);
            }
        }
        throw new ArgumentException("Not a DatePriority");
    }
}    
0
ответ дан 7 December 2019 в 18:43
поделиться

процедура Вида dataGrinView используют процедуру Вида источника данных. К вручную виду данные создают класс, который реализует IBindingListView, реализуйте его, метод сортировки как вы хочет и использует этот класс в качестве DataSource в DataGridView

-1
ответ дан 7 December 2019 в 18:43
поделиться

Да, вы можете сделать это. Вот как вы это делаете.

Предполагая, что у вас есть GRIDVIEW, который требует записей из метода BusinessLayer. Я возьму пример USERMANAGER как класс прокси-слоя бизнеса.

    [DataObjectAttribute()]
    public static class UserManager
    {
        [DataObjectMethod(DataObjectMethodType.Select, true)]
        public static UserCollection GetUsers()
        {
            return UserDB.GetAll();
        }

        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public static UserCollection GetUsers(string sortExpression)
        {
            UserCollection users = UserDB.GetAll();
            users.Sort(new EntityComparer<User>(sortExpression));
            return users;
        }
    }

Посмотрите на эту строку кода в более загруженном методе GetUsers.

users.Sort(new EntityComparer<User>(sortExpression));

Я написал общую реализацию сравнения для моих бизнес-объектов. EntityComparer - это просто универсальный класс, который реализует ICOMPARER интерфейс. Вы можете написать собственную реализацию для сравнения [, которая реализует ICOMPARER интерфейс] и вызвать его как код выше.

Вот как выглядит моя GRIDView ..

         <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
            DataSourceID="ObjectDataSource1">
            <Columns>
                <asp:BoundField DataField="Id" HeaderText="Id" SortExpression="Id" />
                <asp:BoundField DataField="UserName" HeaderText="UserName" 
                    SortExpression="UserName" />
                <asp:BoundField DataField="Password" HeaderText="Password" 
                    SortExpression="Password" />
                <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
                <asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email" />
                <asp:BoundField DataField="CompanyName" HeaderText="CompanyName" 
                    SortExpression="CompanyName" />
            </Columns>
        </asp:GridView>
        <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
            OldValuesParameterFormatString="original_{0}" SelectMethod="GetUsers" 
            TypeName="FilePark.BusinessLayer.UserManager"></asp:ObjectDataSource>

также обратите внимание, что GridView пройдет сортизацию при обращении и вызов перегруженным методом.

0
ответ дан 7 December 2019 в 18:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: