DataGridView
にリンクされているBindingSource
があります。
私のBindingSource
はエンティティのIQueryable
リストにリンクされています。
public void BindTo(IQueryable elements)
{
BindingSource source = new BindingSource();
source.DataSource = elements;
bindingNavigator1.BindingSource = source;
dataGridView1.DataSource = source;
}
ユーザーがグリッドヘッダーをクリックしてデータを並べ替えられるようにしたいと思っています。これを機能させるのに苦労しています。出来ますか?もしそうなら、どうすればいいですか?
私は最近、これと同じ問題に苦しんでいました。 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;
}
それがお役に立てば幸いです。
このコードスニペットは非常にうまく機能し、ほとんどの目的に十分な速度です...
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));
はい、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に伝播され、驚いた。
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の列です。
エンティティの更新は引き続き機能し、データベースに反映されます
多分これはあなたを助けるでしょう。
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
}
}