Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ListView свойство View=details 
:(
    Опции темы
VeryWell
Дата 17.9.2009, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 15.3.2009

Репутация: нет
Всего: нет



Всем привет!
В проводнике можно, выставив режим просмотра в Details (Таблица), сортировать по колонкам.
user posted image
При выделенном столбце (т.е. после того как кликнули по заголовку столбца) все записи сортируются по ключу этого столбца и (!) появляется треугольничик подсказывающий направление сортировки.
Как включть поддержку сортировки с треугольничком для listView с режимом VirtualMode=true.
Благодарен за Ваш труд!
PM MAIL   Вверх
diadiavova
Дата 17.9.2009, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142





--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
VeryWell
Дата 17.9.2009, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 15.3.2009

Репутация: нет
Всего: нет



По ссылке я все изучил первым делом. Коллекция не сортируется.
Вот даже более функциональная сортировка http://support.microsoft.com/kb/319401 Но она почему-то выполняя строчку
Код

listViewCollect.Sort();

оставляет коллекцию без изменений. =(
Виртуальный режим тут что-то заваливает.
PM MAIL   Вверх
ДобренькийПапаша
Дата 17.9.2009, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: нет
Всего: 7





--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
VeryWell
Дата 22.9.2009, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 15.3.2009

Репутация: нет
Всего: нет



Спасибо за ссылку, но увы...
Посмотрите мой проект, почему listView1, который кинут на форму - сортируется, а прицепленный к нему listView2 (объявлен в коде и на форму не кидался) не сортируется, хотя я его прицепил событиями и требую от него ортировки по тому же столбцу?
Проект прилагается...
Код

using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace VirtualMode
{
    public partial class Form1 : Form
    {

        private ListViewColumnSorter lvwColumnSorter;
        private ListView listView2 = new ListView();


            public Form1()
            {
                InitializeComponent();
                //this.listView2.Location = new System.Drawing.Point(0, 121);
                this.listView2.Name = "listView2";
                //this.listView2.Size = new System.Drawing.Size(292, 145);
                this.listView2.TabIndex = 0;
                this.listView2.UseCompatibleStateImageBehavior = false;
                this.listView2.View = System.Windows.Forms.View.Details;
                this.listView2.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listView2_ColumnClick);

                // Create an instance of a ListView column sorter and assign it 
                // to the ListView control.
                lvwColumnSorter = new ListViewColumnSorter();
                this.listView1.ListViewItemSorter = lvwColumnSorter;
                this.listView2.ListViewItemSorter = lvwColumnSorter;
                listView1.RetrieveVirtualItem += new RetrieveVirtualItemEventHandler(listView1_RetrieveVirtualItem);

            }

            void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
            {
                e.Item = listView2.Items[e.ItemIndex];
            }

            private void Form1_Load(object sender, EventArgs e)
            {

                #region Populate listView controls

                ColumnHeader columnheader;        // Used for creating column headers.
                ListViewItem listviewitem;        // Used for creating listview items.

                // Ensure that the view is set to show details.
                listView1.View = View.Details;

                // Create some listview items consisting of first and last names.
                listviewitem = new ListViewItem("John");
                listviewitem.SubItems.Add("Smith");
                this.listView2.Items.Add(listviewitem);

                listviewitem = new ListViewItem("Bob");
                listviewitem.SubItems.Add("Taylor");
                this.listView2.Items.Add(listviewitem);

                listviewitem = new ListViewItem("Kim");
                listviewitem.SubItems.Add("Zimmerman");
                this.listView2.Items.Add(listviewitem);

                listviewitem = new ListViewItem("Olivia");
                listviewitem.SubItems.Add("Johnson");
                this.listView2.Items.Add(listviewitem);

                foreach (ListViewItem item in listView2.Items)
                {
                    listView1.Items.Add((ListViewItem)item.Clone());
                }

                // Create some column headers for the data. 
                columnheader = new ColumnHeader();
                columnheader.Text = "First Name";
                this.listView1.Columns.Add(columnheader);
                this.listView2.Columns.Add((ColumnHeader)columnheader.Clone());

                columnheader = new ColumnHeader();
                columnheader.Text = "Last Name";
                this.listView1.Columns.Add(columnheader);
                this.listView2.Columns.Add((ColumnHeader)columnheader.Clone());

                #endregion Populate listViews controls

                // Loop through and size each column header to fit the column header text.
                foreach (ColumnHeader ch in this.listView2.Columns)
                {
                    ch.Width = -2;
                }

                //listView1.Dock = DockStyle.Fill;
                listView1.VirtualListSize = listView1.Items.Count;
                //listView1.VirtualMode = true;

                listView2.VirtualListSize = listView2.Items.Count;
                //listView.VirtualMode = true;

            }

            private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
            {
                // Determine if clicked column is already the column that is being sorted.
                if (e.Column == lvwColumnSorter.SortColumn)
                {
                    // Reverse the current sort direction for this column.
                    if (lvwColumnSorter.Order == SortOrder.Ascending)
                    {
                        lvwColumnSorter.Order = SortOrder.Descending;
                    }
                    else
                    {
                        lvwColumnSorter.Order = SortOrder.Ascending;
                    }
                }
                else
                {
                    // Set the column number that is to be sorted; default to ascending.
                    lvwColumnSorter.SortColumn = e.Column;
                    lvwColumnSorter.Order = SortOrder.Ascending;
                }

                // Perform the sort with these new sort options.
                this.listView1.Sort();
                ColumnClickEventArgs ea = new ColumnClickEventArgs(e.Column);
                this.listView2_ColumnClick(listView2, ea);
            }

            private void listView2_ColumnClick(object sender, ColumnClickEventArgs e)
            {
                // Determine if clicked column is already the column that is being sorted.
                if (e.Column == lvwColumnSorter.SortColumn)
                {
                    // Reverse the current sort direction for this column.
                    if (lvwColumnSorter.Order == SortOrder.Ascending)
                    {
                        lvwColumnSorter.Order = SortOrder.Descending;
                    }
                    else
                    {
                        lvwColumnSorter.Order = SortOrder.Ascending;
                    }
                }
                else
                {
                    // Set the column number that is to be sorted; default to ascending.
                    lvwColumnSorter.SortColumn = e.Column;
                    lvwColumnSorter.Order = SortOrder.Ascending;
                }

                // Perform the sort with these new sort options.
                this.listView2.Sort();
            }
        }
    /// <summary>
    /// This class is an implementation of the 'IComparer' interface.
    /// </summary>
    public class ListViewColumnSorter : IComparer
    {
        /// <summary>
        /// Specifies the column to be sorted
        /// </summary>
        private int ColumnToSort;
        /// <summary>
        /// Specifies the order in which to sort (i.e. 'Ascending').
        /// </summary>
        private SortOrder OrderOfSort;
        /// <summary>
        /// Case insensitive comparer object
        /// </summary>
        private CaseInsensitiveComparer ObjectCompare;

        /// <summary>
        /// Class constructor.  Initializes various elements
        /// </summary>
        public ListViewColumnSorter()
        {
            // Initialize the column to '0'
            ColumnToSort = 0;

            // Initialize the sort order to 'none'
            OrderOfSort = SortOrder.None;

            // Initialize the CaseInsensitiveComparer object
            ObjectCompare = new CaseInsensitiveComparer();
        }

        /// <summary>
        /// This method is inherited from the IComparer interface.  It compares the two objects passed using a case insensitive comparison.
        /// </summary>
        /// <param name="x">First object to be compared</param>
        /// <param name="y">Second object to be compared</param>
        /// <returns>The result of the comparison. "0" if equal, negative if 'x' is less than 'y' and positive if 'x' is greater than 'y'</returns>
        public int Compare(object x, object y)
        {
            int compareResult;
            ListViewItem listviewX, listviewY;

            // Cast the objects to be compared to ListViewItem objects
            listviewX = (ListViewItem)x;
            listviewY = (ListViewItem)y;

            // Compare the two items
            compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text);

            // Calculate correct return value based on object comparison
            if (OrderOfSort == SortOrder.Ascending)
            {
                // Ascending sort is selected, return normal result of compare operation
                return compareResult;
            }
            else if (OrderOfSort == SortOrder.Descending)
            {
                // Descending sort is selected, return negative result of compare operation
                return (-compareResult);
            }
            else
            {
                // Return '0' to indicate they are equal
                return 0;
            }
        }

        /// <summary>
        /// Gets or sets the number of the column to which to apply the sorting operation (Defaults to '0').
        /// </summary>
        public int SortColumn
        {
            set
            {
                ColumnToSort = value;
            }
            get
            {
                return ColumnToSort;
            }
        }

        /// <summary>
        /// Gets or sets the order of sorting to apply (for example, 'Ascending' or 'Descending').
        /// </summary>
        public SortOrder Order
        {
            set
            {
                OrderOfSort = value;
            }
            get
            {
                return OrderOfSort;
            }
        }

    }

    }


Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  listViewTestDrive.7z 6,75 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.1066 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.