从其他表单更新数据

本文关键字:数据 更新 表单 其他 | 更新日期: 2023-09-27 18:36:18


我有拖曳形式、ListFromDetailForm
ListForm中,我有一个开发快速网格和一些按钮(添加,删除,编辑)
DetailForm中,我有一些文本框和一些按钮(保存,删除,下一个,上一个)
好吧,我必须塞纳里奥
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在这种情况下为空,然后网格不刷新有人有建议吗?

从其他表单更新数据

我将创建一个共享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(); .这只是一个标记,但希望您:)了解这个想法。

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

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

每次您从listForm拨打detailform时,请通过obj例如:

obj.Show()