2


私は2つのフォームを持っています 、そしてListFrom私 はdevexpressグリッドといくつかのボタン(追加、削除、編集)を持って います私はいくつかのテキストボックスといくつかのボタン(保存、削除、次、前) を持っていますリストフォームを開き、製品をクリックして変更し、開いた後、いくつかの変更を加えて保存すると、グリッドが新しい値で更新されます。これには、このコードがありますDetailForm
ListForm
DetailForm

DetailFormListForm

ListFrom で

FrmProduit frm = new FrmProduit(monProduit.Id) { MdiParent = this.MdiParent};
frm.updateDataInGridView += new System.Action(refereshGridView);
frm.Show();

詳細フォームで

 if (updateDataInGridView != null)
      updateDataInGridView();

このシナリオでは、すべて問題ありません

2 番目のシナリオ を開き、detailFromその後 を開き、listFormに変更を加えてdetailFrom[保存] をクリックするupdateDataInGridViewと、この場合は null になり、グリッドが更新されません。

4

2 に答える 2

1

BindingSource両方のフォームがデータを表示するために使用する共有を作成します。アイテムが変更された場合、BindingSourceすべてのコントロールがそれにバインドされていることを通知するように注意し、グリッドを自動的に更新します。

2番目のアプローチは、refereshGridViewメソッドを公開し、これDetailFormsave click行うことです:

var lists = Application.OpenForms.OfType<Form>().Where(x => x.GetType() == typeof(ListFrom));

foreach (var listform in lists)
{
    listform.refereshGridView();
}

FirstOrDefault複数listform開いている可能性があるため、使用しませんでした。

バインディングソースに関する編集

ここにかなり良いチュートリアルがあるので、見てください。

以下は、私が行ったストレッチの最良の例とはほど遠い速記です。

internal static class DataSources
{
     private static BindingSource bs;

     public static BindingSource CerateDataSource(List<object> yourObjects)
     {
          bs = new BindingSource();
          bs.DataSource = yourObjects;
     }

     public static BindingSource GetDataSource()
     {
          return bs;
     }

     public static void Reset()
     {
          bs.ResetBindings(false);
     }
}

そしてあなたのlistview

dataGridView1.DataSource = DataSources.GetData();

保存detailsview時にオブジェクトの 1 つを編集している場所では、次のように呼び出す必要があります。これは単なるマークアップですが、うまくいけばアイデアが得られます:)。BindingSourceDataSources.Reset();

于 2013-10-21T10:04:48.137 に答える
0

の現在のインスタンスを参照していることを常に確認する必要がありdetailformます。listForm

detailform obj = (detailform)Application.OpenForms["detailform"];

そして、あなたが呼び出すたびに、例えば次のようにdetailformしてください:listFormobj

obj.Show()
于 2013-10-21T10:03:26.727 に答える