8

I can't quite work out how to allow a DataGridView populated at runtime to sort (when users click on the column headers) where a LINQ from XML query is the DataSource, via a BindingSource.

    Dim QueryReOrder = From Q In Query _
                       Where ((0 - Q.Qualifier) / cmbTSStakeValue.Text) <= 0.1 _
                       Order By Q.Qualifier Descending _
                       Select Q

    Dim bs As New BindingSource
    bs.DataSource = QueryReOrder
    DGFindMatch.DataSource = bs

Some of the DataGridView's properties are:

Sort            Nothing String
SortProperty                Nothing System.ComponentModel.PropertyDescriptor
SupportsAdvancedSorting         False   Boolean
SupportsChangeNotification      True    Boolean
SupportsFiltering           False   Boolean
SupportsSearching           False   Boolean
SupportsSorting             False   Boolean

Is there a simple solution that will allow a user to be able to sort these values by clicking the column header?

Thanks!

4

6 に答える 6

5

LINQクエリの結果を、並べ替え機能をサポートするものに取り込む必要があります。これは通常、BindingListからクラスを派生させ、派生クラスにSortingCore機能を実装することによって行われます。

そこから選択できる実装の例はたくさんあり、実装するのは非常に簡単です。これはMSDNでそれを行う例です。

これを実装したら、結果を入力してデータソースとして使用するだけで、ユーザーは列を使用して並べ替えることができます。

    //I know that you asked the question in VB.NET but I don't know the syntax that well.
    public class SortableBindingList<T> : BindingList<T>
    {
         //override necessary sort core methods
    }

    SortableBindingList<string> list = new SortableBindingList<string>(QueryReOrder.ToList());

    //use list as your DataSource now
于 2009-05-11T03:03:29.010 に答える
3

私のデフォルトのアプローチは、すべてを DataTable にコピーし、それに DataGridView をバインドすることです。

ページングを追加したい場合、明らかにうまくいきません。

于 2009-02-04T13:30:14.077 に答える
2

クエリ結果を AsEnumerable() として取得する必要があります。

Dim QueryReOrder = (From Q In Query _ Where ((0 - Q.Qualifier) / cmbTSStakeValue.Text) <= 0.1 _ Q.Qualifier 降順で並べ替え _ Q を選択).AsEnumerable()

私は通常 C# を使用しているため、構文を少し変更する必要がある可能性があります。

于 2009-03-12T17:28:17.190 に答える
2

ええ、それで私はしばらくこれに苦労しました。各クラスのカスタムジェネリック IBindingList の作成に関するすべての同じ答え。グリッド ビューの列が静的でない場合、これは途方もない量の作業です。カスタム IBindingList を実装するクラスを変更または更新する必要がなく、linq クエリを変更できるようにしたいと考えています。だから、これが私がしたことです:

1) IEnumerableクエリを取得します。

var query = from o in m_ds.Objective

        join ot in m_ds.ObjectiveType on o.ObjectiveTypeId equals ot.Id
        join dst in m_ds.DevelopmentStatusType on o.DevelopmentStatusTypeId equals dst.Id
        join rt in m_ds.ResultType on o.PrecedenceResultTypeId equals rt.Id

        select new
        {
            o.Id,
            type = ot.Description,
            precedence = rt.Description,
            o.Symbol,
            o.Title,
        };

2) IEnumerableの結果セットをDataTableに変換します。

public static DataTable DataTableFromIEnumerable( IEnumerable ien )
{
    DataTable dt = new DataTable();
    foreach ( object obj in ien )
    {
        Type t = obj.GetType();
        PropertyInfo[] pis = t.GetProperties();
        if ( dt.Columns.Count == 0 )
        {
            foreach ( PropertyInfo pi in pis )
            {
                dt.Columns.Add( pi.Name, pi.PropertyType );
            }
        }

        DataRow dr = dt.NewRow();
        foreach ( PropertyInfo pi in pis )
        {
            object value = pi.GetValue( obj, null );
            dr[ pi.Name ] = value;
        }

        dt.Rows.Add( dr );
    }

    return dt;
}

3) DataGridViewをその汎用 DataTableオブジェクトにバインドします。

var query = SqlHelper.GetFilteredObjective();
var bs = new BindingSource();
bs.DataSource = Utils.DataTableFromIEnumerable( query );
dgvObjectives.DataSource = bs;

4) それだけです。ユーティリティ関数が 1 つあれば、完了です :)

IEnumerable から DataTable に移行する上記の関数を作成した Alberto Poblacion に感謝します: function thread

c# datagridview sortable linq to ADO.NET

于 2010-11-17T20:29:48.940 に答える
1

このページでは MySortableBindingList クラスのみを使用する

それから

var yourLinqList = ...;

MySortableBindingList sortList = new MySortableBindingList(yourLinqList);

dataGridView1.DataSource = sortList;

次に、セルヘッダーがクリックされたときにdataGridViewをソートする必要があります。

于 2013-08-06T08:03:20.137 に答える
1

Brian ONeil's answerで説明されているように、SortableBindingList を作成する方法の完全な例を示す別のリンクは、次の場所にあります。

カスタム データ オブジェクトの並べ替え可能なバインディング リスト

この例をほぼそのまま使用することができました。

于 2009-12-14T18:41:23.350 に答える