@ Marc-Gravellの回答に加えて、任意のリストの並べ替え可能なDGVを簡単に取得できるライブラリがある.ToList()
ので、それを使用してEFコレクション、IQueryables、IEnumerablesなどを呼び出すことができます。使用.ToList()
して並べ替えますが、データバインディングは引き続き機能しますか?私のすべてのテストで、(私にとっては驚くべきことに)答えは「はい」です(私BindingSource
はDGVとデータの間にを使用しています)。
LINQPadのスニペットとデモ用のスクリーンショットは次のとおりです。
// http://www.csharpbydesign.com/2009/07/linqbugging---using-linqpad-for-winforms-testing.html
void Main()
{
var context = this;
using (var form = new Form())
{
var dgv = new DataGridView();
var binder = new BindingSource();
// All of the following variations work
// var efCollection = context.NOS_MDT_PROJECT;
// var sortableCollection = new BindingListView<NOS_MDT_PROJECT>(
// efCollection.ToList());
// var efCollection = context.NOS_MDT_PROJECT.First()
// .NOS_DEFL_TEST_SECT;
// var sortableCollection = new BindingListView<NOS_DEFL_TEST_SECT>(
// efCollection.ToList());
var efCollection =
from p in context.NOS_MDT_PROJECT
where p.NMP_ID==365
from s in p.NOS_GPR_TST_SECT_COMN_DATA
from l in s.NOS_GPR_TST_LOC_DATA
select l;
var sortableCollection = new BindingListView<NOS_GPR_TST_LOC_DATA>(
efCollection.ToList());
binder.DataSource = sortableCollection;
dgv.DataSource = binder;
dgv.Dock = DockStyle.Fill;
form.Controls.Add(dgv);
form.Shown += (o, e) => {
dgv.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
};
form.ShowInTaskbar=true;
form.ShowDialog();
if (context.IsDirty()) // Extension method
{
if (DialogResult.Yes == MessageBox.Show("Save changes?", "",
MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2))
{
context.SaveChanges();
}
}
}
}
BindingListView
(編集:DGVを(BLV)に直接バインドすることは、DGVとBLVの間を使用する場合と同じように機能するようです。したがって、完全なデータバインディングをBindingSource
使用して取得することができます。)dgv.DataSource = efCollection
私はこの質問を調査し、EFコレクション(または、さらに言えば、任意のコレクション)をそのまま並べ替えることができない理由を理解しようと多くの時間を費やしてきました。これは、この質問に関する多くの有用な参考資料へのリンクをまとめたものです。
一般的なデータバインディング
一般的なDGVの並べ替えとデータバインディング
EF固有
マスター/詳細(別名親/子)ビュー
また、拡張メソッド.IsDirty()
が必要な場合は、ここではVBにあります(正しいImportsステートメントを含むモジュールにある必要があります)。
''' <summary>
''' Determines whether the specified object context has changes from original DB values.
''' </summary>
''' <param name="objectContext">The object context.</param>
''' <returns>
''' <c>true</c> if the specified object context is dirty; otherwise, <c>false</c>.
''' </returns>
<System.Runtime.CompilerServices.Extension()> _
Public Function IsDirty(ByVal objectContext As ObjectContext) As Boolean
Return objectContext.ObjectStateManager.GetObjectStateEntries(
EntityState.Added Or EntityState.Deleted Or EntityState.Modified).Any()
End Function