2


我有两个表单,ListFrom并且DetailForm
ListForm我有一个 devexpress 网格和一些按钮(添加、删除、编辑)
DetailForm我有一些文本框和一些按钮(保存、删除、下一个、上一个)
我必须 senario
1 - 我打开 ListForm 并单击一个产品来修改它DetailForm打开了,我进行了一些修改并保存,然后我应该ListForm用新值刷新我的网格。为此我有这个代码

在列表中

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

在详细表格中

 if (updateDataInGridView != null)
      updateDataInGridView();

好吧,在这种情况下一切都很好

第二种情况如果我打开detailFrom,然后打开listForm,我在 中进行一些更改,detailFrom然后单击保存updateDataInGridView在这种情况下为空,然后网格没有刷新任何人有建议吗?

4

2 回答 2

1

我将创建一个共享BindingSource,两种表单都将用于显示数据。如果任何项目发生变化,BindingSource它会通知所有绑定到它的控件,因此它会自动刷新网格。

第二种方法是refereshGridView公开方法并DetailForm继续save 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您从保存时编辑其中一个对象的地方BindingSource,您必须调用:DataSources.Reset();. 这只是一个标记,但希望你能明白:)。

于 2013-10-21T10:04:48.137 回答
0

您必须始终确保您指的是 的当前实例detailform,因此在您的listForm

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

每次你打电话detailformlistForm都这样做obj

obj.Show()
于 2013-10-21T10:03:26.727 回答