Автосортировка списка - PullRequest
       35

Автосортировка списка

9 голосов
/ 20 сентября 2010

Абсолютно озадачен чем-то, что кажется легким, и сделано до смерти ... И все же все еще озадачено.

Что я хочу сделать: у меня есть список WinForms ListBox.Его элементы заполнены объектами, DisplayMember установлен.Во время работы приложения данные в перечисленных элементах могут измениться, включая поле за DisplayMember.Я хочу, чтобы текст, отображаемый в ListBox, изменился, когда это происходит, и я также хочу, чтобы ListBox пересортировал сам себя, чтобы элементы оставались в алфавитном порядке.

BindingList прекрасно работает для обновления отображаемого текста, когдаданные меняются, но, судя по всему, я не могу их отсортировать.

Я просмотрел это: http://msdn.microsoft.com/en-us/library/ms993236.aspx

Плюс многочисленные темы о том, как это сделать, но ни однапохоже, это работает для ListBox.

Установка свойства Sorted в ListBox также бесполезна.

Что мне нужно сделать, чтобы ListBox сам себя отсортировал?

Ответы [ 8 ]

1 голос
/ 04 мая 2011

Я сделал это, создав новый класс BindingSortingList, унаследованный от BindingList. В нем я переопределил все необходимые методы, такие как ApplySortCore () и RemoveSortCore (). Когда вы применяете сортировку, внутренне вы должны скопировать ее в стандартный список, который имеет возможность сортировки, отсортировать его, а затем скопировать обратно в список «это». Это кажется сумасшедшим, но теперь у меня есть класс многократного использования для этой цели.

1 голос
/ 26 сентября 2010

Стиль LVS_SORT в элементе управления списком должен работать, но вы говорите, что это не так. Я бы дважды проверил, что он применяется. У меня никогда не было проблем с самосортирующимся выпадающим списком. Обратите внимание, что это элемент управления списком, о котором мы говорим, а не элемент управления списком.

1 голос
/ 24 сентября 2010

Сброс источника данных будет эффективно сортировать ListBox:

    listBox1.DataSource = null;
    listBox1.DataSource = myBindingList;
    listBox1.DisplayMember = "MyField";

Но это не происходит автоматически.Как я понимаю, сортировка должна происходить всякий раз, когда поле позади DisplayMember обновляется, через событие или что-то в этом роде ...

В любом случае, смотрите мой полный тест:

public partial class Form1 : Form
{
    public BindingList<ABC> myBindingList = new BindingList<ABC>();

    public Form1() {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e) {
        myBindingList.Add(new ABC("zzz"));
        myBindingList.Add(new ABC("aaa"));
    }

    private void button2_Click(object sender, EventArgs e) {
        myBindingList[0].MyField = "ccc"; // was "zzz"
        myBindingList[1].MyField = "ddd"; // was "aaa"

        listBox1.DataSource = null;
        listBox1.DataSource = myBindingList;
        listBox1.DisplayMember = "MyField";
    }

    private void Form1_Load(object sender, EventArgs e) {
        listBox1.DataSource = myBindingList;
        listBox1.DisplayMember = "MyField";

    }
}

public class ABC  {
    public string MyField { get; set; } 
    public ABC(string val) {
        MyField = val;
    }
}
1 голос
/ 21 сентября 2010

Как и в сообщении Patrol02, однако вы можете попробовать установить для DataSource значение null, а затем переназначить его на основе события, вызванного изменением размера списка.Вы можете использовать шаблон наблюдателя в коллекции, переопределяя методы Add и Remove, чтобы уведомить наблюдателей о повторной привязке.

1 голос
/ 20 сентября 2010

Вы можете использовать объект BindingSource. Просто перетащите его в форму и укажите свойство ListBox.DataSource на этот объект BindingSource. Затем перейдите в свойства BindingSource и определите Sort, как вам нужно.

Затем в коде вы можете установить myBindingSource.DataSource = myCollection и вуаля, ваш список будет заполнен и отсортирован. Легко.

0 голосов
/ 04 октября 2011
namespace SilverlightApplication8
{
    public partial class MainPage : UserControl
    {
        ObservableCollection<UserData> users = new ObservableCollection<UserData>();
        public MainPage()
        {
            Service1Client client = new Service1Client();
            client.GetUsersCompleted += completed;
            client.GetUsersAsync(5);
            InitializeComponent();

            image.Source = new BitmapImage(new Uri(@"c:\1.JPG"));
        }    

        private void completed(object sender, GetUsersCompletedEventArgs e)
        {
            users=e.Result;

            UsersList.ItemsSource = users;
        }

        private void SelectionChngd(object sender, SelectionChangedEventArgs e)
        {
            UserData u= (UserData)(UsersList.SelectedItem);
            DescText.Text = u.Desc;

            image.Source = new BitmapImage(new Uri(@"http://profile.ak.fbcdn.net/hprofile-ak-snc4/49939_713180125_9000_q.jpg"));
        }

        private void Grid_MouseEnter(object sender, MouseEventArgs e)
        {
            if (UsersList.SelectedItem != null)
            {
                UserData u = (UserData)(UsersList.SelectedItem);
                DescText.Text = u.Desc;
            }
        }
    }
}
0 голосов
/ 04 октября 2011
<ListBox x:Name="UsersList"  SelectionChanged="SelectionChngd">
            <ListBox.ItemTemplate>
                <DataTemplate >
                    <Border BorderBrush="Red" BorderThickness="5">
                    <Grid MouseEnter="Grid_MouseEnter"> 
                        <Grid.RowDefinitions>
                            <RowDefinition/>
                            <RowDefinition/>
                        </Grid.RowDefinitions>
                            <TextBlock   Text="{Binding Name}"/>
                        <TextBlock Grid.Row="1" Text="{Binding Email}"/>
                    </Grid>
                    </Border>
                </DataTemplate>
            </ListBox.ItemTemplate>

        </ListBox>
0 голосов
/ 20 сентября 2010
 private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
      //Sorting function
    }

Как насчет этого?

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