1

MSDN のドキュメントには、EntitySet が IBindingList を実装すると記載されています。

( http://msdn.microsoft.com/en-us/library/bb546190.aspxの「EntitySet へのバインディング」を参照)

ただし、EntitySet がこのインターフェイスを実装していないことは明らかです。

では、どのように並べ替えるのですか?

コンテキストとして、このセットを WPF ListView にバインドしています。

私が解決しようとしている問題のより広いコンテキストについては、この投稿を参照してください。

4

4 に答える 4

7

EntitySet<T> は IBindingList を実装していません... IBindingList を取得するメソッドを提供します。BindingList<T> である SortableBindingList<T> から派生した EntitySetBindingList<T> のインスタンスを取得するには、.GetNewBindingList() を呼び出す必要があります。EntitySetBindingList は、それが作成された元の EntitySet<T> のラッパーに過ぎないため、これを変更すると、元の EntitySet が変更されます。

編集: BindingList による並べ替え:

BindingList で並べ替えるには、並べ替えを可能にする何らかのインターフェイスを公開する必要があります。並べ替えは BindingList<T> クラス内でサポートされていますが、保護されたプロパティとメソッドを介して行われます。ラッパーを使用して、表現力豊かな並べ替えメソッドを公開できるはずです。

public class EntitySetBindingWrapper<T>: BindingList<T>
{
    public EntitySetBindingWrapper(BindingList<T> root) : base(root)
    {
    }

    public void Sort(Expression<Func<T, P>> expr, ListSortDirection direction)
    {
        if (expr == null)
            base.RemoveSortCore();

        MemberExpression propExpr = expr as MemberExpression;
        if (propExpr == null) throw new ArgumentException("You must provide a property", "expr");

        PropertyDescriptorCollection descriptorCol = TypeDescriptor.GetProperties(typeof(T));
        IEnumerable<PropertyDescriptor> descriptors = descriptorCol.Cast<PropertyDescriptor>();
        PropertyDescriptor descriptor = descriptors.First(pd => pd.Name == propExpr.Member.Name);

        base.ApplySortCore(descriptor, direction);
    }
}

その後、次のようにソートできるはずです。

var bindingWrapper = new EntitySetBindingWrapper(myEntitySet.GetNewBindingList());
bindingWrapper.Sort(e => e.MyProperty, ListSortDirection.Ascending);

listView.DataSource = bindingWrapper;

EntitySetBindingWrapper クラスの追加の実装がある場合があります... BindingList<T> で通常はパブリックなメソッドを、コンストラクターに提供されるメソッドに転送するなどです。

于 2009-05-29T14:49:05.113 に答える
1

OrderByDecending!

var tags = objContext.Tags;
gvTester.DataSource = tags.OrderByDescending(x => x.TagID); ;
gvTester.DataBind();
于 2011-11-10T22:38:38.120 に答える
0

.ToList().OrderBy(x=>x.FieldToSortBy) を実行できますか?

于 2009-05-29T13:51:57.240 に答える
0

Hainesy - Vinny の投稿に対するあなたのコメントから判断すると、あなたは彼の要点を見逃していると思います... [私はこれをあなたの質問に対する直接の回答として提示しているわけではありません。考えられる混乱を解消するために、Vinny のポイントについて詳しく説明しているだけです。それについて。

このオブジェクトを考えてみましょう:

public class Person
{
    public string FirstName;
    public string MiddleInitial;
    public string LastName;

    public DateTime DateOfBirth { get; set; }

    public int Age
    {
        get
        {
            return (int)DateTime.Today.Subtract(DateOfBirth).TotalDays / 365;
        }
    }
}

ここで、People という名前の Person セットアップのリストがあるとします。

var people = new List<Person>();

そして、私のリストにはたくさんの人がいます。

var sortedByLastName = people.OrderBy(o => o.LastName);
var sortedByFirstName = people.OrderBy(o => o.FirstName);
var sortedByAge = people.OrderBy(o => o.Age);
var sortedByAgeDesc = people.OrderByDescending(o => o.Age);
var sortedByLastThenFirst = people.OrderBy(o => o.LastName).ThenBy(o => o.FirstName);

これは複雑なオブジェクト用です。文字列のようなプリミティブ型のリストがある場合:

var strings = new List<string>();

オブジェクトの一部のプロパティではなく、それら自体に基づいて並べ替えたい

var sorted = strings.OrderBy(s => s);

これにより、オブジェクトがソートされます。IComparable を実装して既定の比較子で並べ替える複雑なオブジェクトを並べ替える場合も、同じ考え方を使用できます。

EntitySet は、プリミティブ型であろうと複雑なオブジェクトであろうと、同様の方法で並べ替えることができます。

于 2009-05-29T14:48:26.550 に答える