ユーザーが項目をある項目から別の項目に移動できる 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)
しかし、これをジェネリックにして、渡されたタイプのフィールドにする方法がわかりません。
ヘルプ/ガイダンスをいただければ幸いです。