9

完全被看似简单的事情难住了,已经被做死了……但仍然难住了。

我想要做什么:我有一个 WinForms 列表框。它的项目由对象填充,DisplayMember 已设置。随着应用程序的运行,列出的项目中的数据可能会发生变化,包括 DisplayMember 后面的字段。我希望在发生这种情况时更改 ListBox 中显示的文本,并且我还希望 ListBox 重新排序,以便项目保持字母顺序。

当数据发生变化时,BindingList 可以很好地更新显示的文本,但对于我来说,我无法对其进行排序。

我审查了这个:http: //msdn.microsoft.com/en-us/library/ms993236.aspx

加上这里有很多关于如何做到这一点的线程,但似乎没有一个适用于 ListBox。

在 ListBox 上设置 Sorted 属性同样没有帮助。

我需要做什么才能让 ListBox 自行排序?

4

8 回答 8

1

列表控件上的 LVS_SORT 样式应该可以工作,但你说它不行。我会仔细检查它是否已应用。我从来没有遇到过自排序下拉列表控件的任何问题。请注意,这是我们所说的列表控件,而不是列表视图控件。

于 2010-09-26T16:45:28.190 回答
1

您可以使用 BindingSource 对象。只需将其拖放到您的表单中并将您的 ListBox.DataSource 属性指向此 BindingSource 对象。然后转到 BindingSource 的属性并根据需要定义 Sort。

然后在代码中你可以设置myBindingSource.DataSource = myCollection和瞧,你的列表框被填充和排序。简单的。

于 2010-09-20T10:59:19.253 回答
1

为此,我创建了一个继承自 BindingList 的新类 BindingSortingList。在其中,我覆盖了所有必要的方法,例如 ApplySortCore() 和 RemoveSortCore()。当您应用排序时,您基本上必须在内部将其复制到具有排序能力的标准列表中,对其进行排序,然后将其复制回“this”列表中。这似乎很疯狂,但现在我为此目的有一个可重用的类。

于 2011-05-04T19:50:50.293 回答
1

与 Patrol02 的帖子一样,您可能希望尝试将 DataSource 设置为 null,然后根据列表大小更改触发的事件重新分配它。您可以在集合上使用观察者模式,覆盖 Add 和 Remove 方法来通知观察者重新绑定自己。

于 2010-09-21T11:26:42.147 回答
1

重置 DataSource 将有效地对 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;
    }
}
于 2010-09-24T19:42:11.180 回答
0
 private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
      //Sorting function
    }

那这个呢??

于 2010-09-20T03:50:33.253 回答
-2
<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>
于 2011-10-04T06:12:24.060 回答
-4
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;
            }
        }
    }
}
于 2011-10-04T06:27:58.813 回答