9

簡単そうに見える何かに完全に困惑し、死ぬまで行われた...それでもまだ困惑している。

やりたいこと:WinFormsリストボックスがあります。そのアイテムにはオブジェクトが入力され、DisplayMemberが設定されます。アプリの実行中に、DisplayMemberの背後にあるフィールドなど、リストされたアイテムのデータが変更される場合があります。これが発生したときにリストボックスに表示されるテキストを変更したいのですが、リストボックス自体を再ソートして、アイテムがアルファベット順に残るようにしたいのです。

BindingListは、データが変更されたときに表示されたテキストを更新するために正常に機能しますが、私の人生の間、それを並べ替えることはできません。

私はこれをレビューしました:http: //msdn.microsoft.com/en-us/library/ms993236.aspx

さらに、これを行う方法についての多数のスレッドがありますが、リストボックスでは機能しないようです。

ListBoxでSortedプロパティを設定することも同様に役に立ちません。

ListBoxをソートするために何をする必要がありますか?

4

8 に答える 8

1

ただし、Patrol02 の投稿と同様に、DataSource を null に設定してから、リスト サイズの変更によってトリガーされるイベントに基づいて再割り当てすることをお勧めします。コレクションでオブザーバー パターンを使用し、Add メソッドと Remove メソッドをオーバーライドして、ウォッチャーに自分自身を再バインドするよう通知することができます。

于 2010-09-21T11:26:42.147 に答える
1

これを行うには、BindingList から継承した新しいクラス BindingSortingList を作成しました。その中で、ApplySortCore() や RemoveSortCore() など、必要なすべてのメソッドをオーバーライドしました。並べ替えを適用する場合、基本的には、並べ替え機能を持つ標準リストにコピーし、並べ替えてから、「this」リストにコピーして戻す必要があります。クレイジーに思えますが、この目的のために再利用可能なクラスができました。

于 2011-05-04T19:50:50.293 に答える
1

BindingSource オブジェクトを使用できます。それをフォームにドラッグ アンド ドロップし、ListBox.DataSource プロパティをこの BindingSource オブジェクトにポイントするだけです。次に、BindingSource のプロパティに移動し、必要に応じて Sort を定義します。

次に、設定できるコードでmyBindingSource.DataSource = myCollectionリストボックスにデータが入力され、並べ替えられます。簡単。

于 2010-09-20T10:59:19.253 に答える
1

リスト コントロールの LVS_SORT スタイルは機能するはずですが、そうではないとおっしゃっています。適用されていることを再確認します。自己ソート ドロップダウン リスト コントロールで問題が発生したことはありません。これは、私たちが話しているリスト コントロールであり、リストビュー コントロールではないことに注意してください。

于 2010-09-26T16:45:28.190 に答える
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 に答える