0

次のように、テーブルにBindingSourceバインドされたグリッドにバインドされています。DataContext

myBindingSource.DataSource = myDataContext.MyTable;
myGrid.DataSource = myBindingSource;

BindingSource挿入後に更新できませんでした。これはうまくいきませんでした:

myDataContext.Refresh(RefreshMode.OverwriteCurrentValues, myBindingSource);
myBindingSource.ResetBinding(false);

これも:

myDataContext.Refresh(RefreshMode.OverwriteCurrentValues, myDataContext.MyTable);
myBindingSource.ResetBinding(false);

私は何をすべきか?

4

7 に答える 7

2

私は問題を解決しましたが、私が望んでいた方法ではありません。

DataContext と Linq To SQL は、作業単位の操作に最適であることがわかりました。DataContext を作成し、仕事を終わらせ、それを破棄することを意味します。別の操作が必要な場合は、別の操作を作成します。

この問題のために私がしなければならなかったことは、this.dx = new MyDataContext(); のように DataContext を再作成することだけでした。これを行わないと、常に古い/キャッシュされたデータが取得されます。さまざまなブログ/フォーラムの投稿から読んだことから、DataContext は軽量であり、この A-OK を実行しています。これは、1日検索した後に見つけた唯一の方法でした。

于 2009-10-23T08:58:01.013 に答える
1

Contest.Tableだけでなく、新しいクエリによるグリッドデータソースの参照。簡単な解決策<しかし機能している。

Whreは例えばです。!!!!! ありがとう-問題は数日後に解決しました!!! しかし、とても簡単な方法で..

CrmDemoContext.CrmDemoDataContext Context = new CrmDemoContext.CrmDemoDataContext();

var query = from it in Context.Companies select it;
// initial connection
dataGridView1.DataSource = query;

変更後またはデータの追加後

Context.SubmitChanges();
//call here again 
dataGridView1.DataSource = query;
于 2011-09-23T14:19:11.573 に答える
1

私も同じ問題を抱えてる。フォームを使用して、毎回コンテキストを保存せずにテーブルに行を作成していました。幸いなことに、これを行う複数のフォームがあり、1 つはグリッドを適切に更新し、もう 1 つは更新しませんでした。

唯一の違いは?
あなたがしたことと同様に(バインディングソースを使用せずに)エンティティにバインドしました:

myGrid.DataSource = myDataContext.MyTable;

私がバインドした2番目:

myGrid.DataSource = myDataContext.MyTable.ToList();

2番目の方法が機能しました。

于 2011-02-17T16:56:59.290 に答える
1

最後に、もう 1 つの有効なソリューションです。

このソリューションは正常に機能し、DataContext を再作成する必要はありません。

  1. 内部テーブル キャッシュをリセットする必要があります。 このためには、リフレクションを使用して Table のプライベート プロパティ cachedList を変更する必要があります。

次のユーティリティ コードを使用できます。

    public static class LinqDataTableExtension
    {
        public static void ResetTableCache(this ITable table)
        {
            table.InternalSetNonPublicFieldValue("cachedList", null);
        }

        public static void ResetTableCache(this IListSource source)
        {
            source.InternalSetNonPublicFieldValue("cachedList", null);
        }

        public static void InternalSetNonPublicFieldValue(this object entity, string propertyName, object value)
        {
            if (entity == null)
                throw new ArgumentNullException("entity");
            if(string.IsNullOrEmpty(propertyName))
                throw new ArgumentNullException("propertyName");

            var type = entity.GetType();
            var prop = type.GetField(propertyName, BindingFlags.NonPublic | BindingFlags.Instance);
            if (prop != null)
                prop.SetValue(entity, value);
// add any exception code here if property was not found :)
        }
    }

次のようなものを使用します。

   var dSource = Db.GetTable(...)
   dSource.ResetTableCache();
  1. 次のようなものを使用して BindingSource をリセットする必要があります。

    _BindingSource.DataSource = new List(); _BindingSource.DataSource = dSource; // ハック - バインディング リストを更新

  2. 楽しみ :)

于 2010-04-08T17:29:19.247 に答える
0

行の挿入方法がわかりません。を使用した場合も同じ問題DataContext.InsertOnSubmit(row)がありましたが、代わりに BindingSource に行を挿入しBindingSource.Insert(Bindingsource.Count, row) 、 DataContext をDataContext.SubmitChanges()およびのみに使用した場合DataContext.GetChangeSet()。BindingSource は、行をグリッドとコンテキストの両方に挿入します。

于 2011-11-03T01:20:24.623 に答える
0

データグリッドも更新/更新する必要があると思います。グリッドを強制的に再描画する必要があります。

于 2009-10-20T13:05:58.663 に答える