2

ユーザーが項目をある項目から別の項目に移動できる 2 つの DevExpress ListBoxControls を使用する winform アプリがあります。左側のボックスには「すべての利用可能な」セクションがあり、右側のボックスには現在ユーザーに割り当てられているセクションがあります。私はジェネリックを初めて使用しますが、このプロジェクトでそれらを実装しようとしています。各 ListBoxControl は、その DataSource を介して ObservableCollection にバインドされます。

ObservableCollection<Sections> allSections = new ObservableCollection<Sections>((dbContext.Sections
                    .OrderBy(s => s.SectionName).AsEnumerable<Sections>()));

listboxAllSections.DataSource = allSections;
listboxAllSections.DisplayMember = "SectionName";
listboxAllSections.ValueMember = "SectionID";

したがって、ユーザーがアイテムを前後に移動できるように、各リストボックスの間に 4 つのボタンがあります。

MoveRight >
MoveAllRight >>
MoveAllLeft <
MoveAllLeft<<

のためMoveRightに、MoveLeft私はこのジェネリック関数を作成しました:

private void MoveItem<T>(ListBoxControl source, ListBoxControl target)
{
    ObservableCollection<T> sourceItems = (ObservableCollection<T>)source.DataSource;
    ObservableCollection<T> targetItems = (ObservableCollection<T>)target.DataSource;

    target.BeginUpdate();

    //Add items to target.
    foreach (T item in source.SelectedItems)
        targetItems.Add(item);

    //Remove items from source.
    for (int x = 0; x < source.SelectedItems.Count; x++)
        sourceItems.Remove((T)source.SelectedItems[x]);

    target.EndUpdate();
}

すべてうまく機能しますが、並べ替えを追加したいと思います。アイテムを右に移動する場合は並べ替えは必要ありません。アイテムを左に移動する場合のみです。特定のプロパティに基づいてジェネリック コレクションを並べ替える方法がわかりません。たとえば、並べ替えたいSectionsというプロパティがあります。SectionName実際の型を使用すると、これを行うことができます。

ObservableCollection<Sections> sourceItems = (ObservableCollection<Sections>)listboxAllSections.DataSource;

var sortedItems = new ObservableCollection<Sections>();

foreach (var item in sourceItems.OrderBy(t => t.SectionName))
    sortedItems.Add(item);
listboxAllSections.DataSource = sortedItems;

sourceItems.OrderBy(t => t.SectionName)しかし、これをジェネリックにして、渡されたタイプのフィールドにする方法がわかりません。

ヘルプ/ガイダンスをいただければ幸いです。

4

2 に答える 2

1

あなたはこれを行うことができます:

private void MoveItem<T>(ListBoxControl source, ListBoxControl target) 
                                                             where T : IComparable
{
  var sortedItems = new ObservableCollection<T>();
  var sordet = sourceItems.OrderBy(t => t);

}

自分自身を何かと比較する方法を知っている場合は、(<-疑似コード)をT呼び出すことができ、 List<T>.OrderBy(c => c)常にソートされたリストがあります。

于 2013-03-12T12:45:14.070 に答える
0

CollectionViewSourceのデータを並べ替えるには、を使用してみてくださいListBox。この方法では、データを .xml でソートしておく必要はありませんObservableCollection。さらに、コード ビハインド / ViewModel をプレゼンテーション ロジックから分離します。MSDNに CollectionViewSource の使用方法を示す例があります。

于 2013-03-12T13:58:57.590 に答える