web-dev-qa-db-ja.com

EF4エンティティにリンクされているバインディングソースにバインドされているときにDataGridViewを並べ替える方法

DataGridViewにリンクされているBindingSourceがあります。

私のBindingSourceはエンティティのIQueryableリストにリンクされています。

    public void BindTo(IQueryable elements)
    {
        BindingSource source = new BindingSource();
        source.DataSource = elements;

        bindingNavigator1.BindingSource = source;
        dataGridView1.DataSource = source;

    }

ユーザーがグリッドヘッダーをクリックしてデータを並べ替えられるようにしたいと思っています。これを機能させるのに苦労しています。出来ますか?もしそうなら、どうすればいいですか?

19
Martin

私は最近、これと同じ問題に苦しんでいました。 IQueryableインターフェースは、DataViewGridがデータを自動的にソートする方法を知るのに十分な情報を提供していないようです。したがって、使用できるものを使用してエンティティソースからコレクションを再パッケージ化するか、私が行ったことを実行して並べ替え機能を手動で処理する必要があります。

      private void myDataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
  {
     DataGridViewColumn column = myDataGridView.Columns[e.ColumnIndex];

     _isSortAscending = (_sortColumn == null || _isSortAscending == false);

     string direction = _isSortAscending ? "ASC" : "DESC";

     myBindingSource.DataSource = _context.MyEntities.OrderBy(
        string.Format("it.{0} {1}", column.DataPropertyName, direction)).ToList();

     if (_sortColumn != null) _sortColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
     column.HeaderCell.SortGlyphDirection = _isSortAscending ? SortOrder.Ascending : SortOrder.Descending;
     _sortColumn = column;
  }

それがお役に立てば幸いです。

12
Aaron Young

このコードスニペットは非常にうまく機能し、ほとんどの目的に十分な速度です...

int iColNumber = 3; //e.g., sorting on the 3rd column of the DGV

MyBindingSource.DataSource = MyBindingList.OrderByDescending(o => o.GetType().GetProperty(MyDataGridView.Columns[iColNumber].Name).GetValue(o));
1
islandTrader

はい、EFデータにバインドすると、ソート可能なDGVを簡単に作成できます。 BLWライブラリBindingListViewを使用します(また、 DataGridViewの自動並べ替えを実装するにはどうすればよいですか? )。

_public void BindTo(IQueryable elements)
{
    BindingSource source = new BindingSource();
    source.DataSource = new BindingListView(elements.ToList());

    bindingNavigator1.BindingSource = source;
    dataGridView1.DataSource = source;

}
_

私のテストでは、コンストラクター内で.ToList()が呼び出された場合でも(上記のように)、変更がDBに伝播され、驚いた。

1
Pat

VB.NET

Linq構文でbindingsourceを使用している場合は、次のようにデータを並べ替えることができます

この場合、データグリッドビューに関連付けられたbindingsourceを、エンティティフレームワークオブジェクト「NCFile」から「NCFilePartSet」のリストへの外部列を持つものとしてロードする場合

bsFileSections.DataSource = From ncfps In NCFile.NCFilePartSet Order By ncfps.Sort Select ncfps 

またはこのように

bsFileSections.DataSource = NCFile.NCFilePartSet.OrderBy(Function(ncfps) ncfps.Sort)

ここで、「Sort」はNCFilePartSetの列です。

エンティティの更新は引き続き機能し、データベースに反映されます

1
user2019717

多分これはあなたを助けるでしょう。

internal class CustomDataGridView : DataGridView
{   
    public SortOrder MySortOrder { get; set; }
    protected override void OnColumnHeaderMouseClick(DataGridViewCellMouseEventArgs e)
    {
        BindingSource MyBindingSource = (BindingSource)base.DataSource;
        DataTable MyDataTable = (DataTable)MyBindingSource.DataSource;
        switch (MySortOrder)
        {
            case SortOrder.None:
                MyDataTable.DefaultView.Sort = base.Columns[e.ColumnIndex].Name + " ASC";
                MyDataTable = MyDataTable.DefaultView.ToTable();
                MyBindingSource.DataSource = MyDataTable;
                MySortOrder = SortOrder.Ascending;
                break;

            case SortOrder.Ascending:
                MyDataTable.DefaultView.Sort = base.Columns[e.ColumnIndex].Name + " DESC";
                MyDataTable = MyDataTable.DefaultView.ToTable();
                MyBindingSource.DataSource = MyDataTable;
                MySortOrder = SortOrder.Descending;
                break;

            case SortOrder.Descending:
                MyDataTable.DefaultView.Sort = Properties.Settings.Default.OderDataGridView; //SqlOriginOrder
                MyDataTable = MyDataTable.DefaultView.ToTable();
                MyBindingSource.DataSource = MyDataTable;
                MySortOrder = SortOrder.None;
                break;
        }
        base.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = MySortOrder; //mini arrow 
    }
}
0