【发布时间】:2010-12-23 22:19:27
【问题描述】:
我目前正在使用 WPF 开发 C# 应用程序。我有 2 个表格。 Form1 有 DataGrid,我需要做的是从 form2 更新数据库,然后在 form1 的数据网格中重新加载数据。
我该怎么做。非常感谢
【问题讨论】:
标签: c# wpf wpfdatagrid
我目前正在使用 WPF 开发 C# 应用程序。我有 2 个表格。 Form1 有 DataGrid,我需要做的是从 form2 更新数据库,然后在 form1 的数据网格中重新加载数据。
我该怎么做。非常感谢
【问题讨论】:
标签: c# wpf wpfdatagrid
您可以使用中间类通过事件交换通知。
public static class ApplicationEvents
{
public static event EventHandler DataChanged;
public static void NotifyDataChanged()
{
EventHandler temp = DataChanged;
if (temp != null)
{
temp(null, EventArgs.Empty);
}
}
}
现在,在Form1 的Loadevent 中,您可以注册DataChanged event。
void Form1_Load()
{
ApplicationEvents.DataChanged += new EventHandler(ApplicationEvents_DataChanged);
}
void ApplicationEvents_DataChanged(object sender, EventArgs e)
{
// Write code to update DataGrid
}
因此,无论何时引发该事件,Form1 都知道更新其 DataGrid:
// Suppose in Form2, on a button click you want Form1 to update its DataGrid
// You just need to call NotifyDataChanged() method
void Form2_Button1_Click()
{
ApplicationEvents.NotifyDataChanged();
}
【讨论】:
你有很多选择。
一种选择是在 Form1 上为您的集合提供内部/公共属性,该集合具有绑定到数据网格的数据。当您将记录存储到 Form2 上的数据库时,调用 Form1 上的属性并添加/删除记录,如果您有 ObservableCollection,那么它将自动从集合中添加或删除。如果更新记录,则需要在集合中找到它并更新值,如果每个属性都有 INotifyProperty,则 Form1 上的记录将被更新。
另一种选择是在 Form1 上使用公共/内部方法 UpdateCustomer,因此当您在 Form2 上保存记录时,您调用 Form1.UpdateCustomer(newCustomer) 并且 Form1 将处理新客户。
我个人喜欢在 Window1 UpateRecord(Customer updatedCustomer) 上有委托。这种方式不是调用属性或方法,而是从任何窗口调用委托并将新值传递给 Window1。这样任何表单都可以调用委托并将新记录传递给表单。
顺便说一句,如果您使用的是委托/方法/属性应该在 VM 上的 MVVM。
【讨论】:
一种方法是,如果你使用 MVP,
保存数据库中数据的模型及其与数据库的通信。
将模型数据映射到视图的演示者。
视图 - 数据的 UI 表示(即你的 form1 和 form2)
这两个视图应该共享相同的模型,该模型具有更新的数据(当表单 2 更新数据时,它实际上更新模型和模型然后更新数据库中的数据),两个视图的演示者(不同的演示者观察使用自定义绑定/事件的模型数据)收到更新数据的通知,然后他们可以更新他们的视图(使用数据绑定)。
【讨论】: