【发布时间】:2021-01-31 16:14:31
【问题描述】:
我的 Windows 窗体应用程序中有两个窗体。我在 form1 中有一个 datagridview,我可以从 form1 更新 datagridview 的数据。现在,我需要从 form2 更新 datagridview。我正在从 form2 调用相同的方法,用于从 form1 更新 datagridview。
从form2调用该方法时,在调试中我可以看到它更新了datagridview的数据源,但它没有更新UI上的数据。
我知道这是一个重复的问题。我尝试了很多不同的方法。我也尝试过 MdiContainer 的概念,但对我没有用。
我在 form1 中有以下方法,这些方法可以更新 datagridview(CustomerList) 的数据,并在从 form1 调用 BindCustomerList() 方法时更新 UI 上的 datagridview
//form1
public void BindCustomerList()
{
CustomerList.AutoGenerateColumns = false;
CustomerList.DataSource = FetchEmpDetails();
CustomerList.ClearSelection();
}
public DataTable FetchEmpDetails()
{
if (sqlCon.State == ConnectionState.Closed)
{
sqlCon.Open();
}
DataTable dtData = new DataTable();
sqlCmd = new SqlCommand("sp_customers", sqlCon);
sqlCmd.CommandType = CommandType.StoredProcedure;
sqlCmd.Parameters.AddWithValue("@ActionType", "FetchData");
SqlDataAdapter sqlSda = new SqlDataAdapter(sqlCmd);
sqlSda.Fill(dtData);
return dtData;
}
我正在使用下面的代码从 form2 调用 BindCustomerList(),它更新了 datagridview(CustomerList) 的数据源,但没有更新 form1 中的 UI。
//form2 button click event
private void btnSave_Click(object sender, EventArgs e)
{
Form1 form1 = new Form1(); //object of form1 in form2
this.Close(); //closing form2 on button click
form1.BindCustomerList(); //calling form1 method to update datagridview.
}
【问题讨论】:
-
This:
Form1 form1 = new Form1();生成一个Form1类型的新表单,与Form1的现有实例完全无关。 -
我的建议是使用一个管理器类来负责与加载和呈现数据相关的所有操作。我将包括您的
BindCustomerList()和FetchEmpDetails()。首次初始化类对象时,传递用于呈现数据的 DataGridView 的实例。然后,您可以在需要时调用这些方法,包括其他 Form 类。或者,将 Form1 的实例传递给 Form2 并使用该实例调用公共方法。如果 Form1 实现一个已知的接口会更好。 -
@Jimi 你能像你在第二条评论中提到的任何现有示例一样给我吗,我是 Windows 窗体的新手。
-
您应该指定 Form2 正在做什么。为什么需要从该界面重新加载数据以将其呈现在另一个(Form1)中?发生了什么?按钮被命名为
btnSave,但你没有保存,你正在重新加载(从你在这里显示的内容)。如果您实际上是将数据保存回数据库,则在 Form1 中,只需在创建实例时订阅 Form2 的FormClosed事件,然后再显示它。当 Form2 关闭时,会引发事件,您可以从事件处理程序中调用BindCustomerList()。因此 Form2 不需要知道任何有关数据获取过程的信息。 -
话虽如此,Form1 或 Form2 都不应该知道这些类所呈现的数据的任何信息。您应该有负责存储和获取数据的类对象。您的表单应仅用于向用户呈现数据:这些类不应包含与数据源交互所需的逻辑。这样,您只需在一个地方管理所有数据。如果与数据源相关的某些事情发生了变化,您的表单将不需要任何更改,只需 数据管理器 类即可。演示者类将始终接收相同的数据对象。
标签: c# .net winforms datagridview desktop-application