【问题标题】:Not able to update datagridview data in windows form application C#无法在 Windows 窗体应用程序 C# 中更新 datagridview 数据
【发布时间】: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


【解决方案1】:

让您的 form2 构造函数接受一个数据表参数,并将其分配给另一个网格的 DataSource:

public Form2(DataTable dt){
  InitializeComponent();

  otherDataGridView.DataSource = dt;
}

当你在 form1 中创建一个新的 Form2 时,在你至少调用了一次 BindCustomerList 之后:

var f = new Form2(CustomerList.DataSource as DataTable);

我从 form2 调用 BindCustomerList()

这行不通; bindCustomerList 设置form1的datagridview的DataSource;这与form2无关。要让表单共享数据,您必须传递要共享的数据,例如在我上面的代码中(例如)

【讨论】:

  • BindCustomerList() 旨在使用 StoredProcedure 重新加载数据(Form2 中的操作未知,但这似乎是预期的结果)——你忘了public Form2() : this(null) { }
  • 我在 form2 构造函数中添加了 datagridview 参数,然后通过调用 FetchEmpDetails() 更新其数据源后,它起作用了。
  • 听起来不对。如果您想在 form1 上有一个 datagridview,在 form2 上有一个 datagridview 并让它们共享详细信息,以便在 form1 的 datagridview 中也观察到您在 form2 的 datagridview 中所做的任何更改,那么您传递两个 DGV 要共享的数据表模型,所以两个 DGV 具有相同的数据源。你没有你的 form2 获取任何东西; form1 就是这样做的。 Form1 进行提取,然后将其提取的数据交给 form2。不要使表单2过于复杂。 Form2 不需要知道任何关于 form1 或 FetchEmpDetails 的信息,它只需要接受一个数据表并绑定它
  • @Jimi 是对我的评论?
  • 50/50。 You forgot... 部分仅占您的 50%,我不确定 OP 知道如何处理它。 StoredProcedure 部分旨在触发来自 OP 的响应,因为不清楚 Form2 实际对数据做了什么。数据共享/处理设计似乎有缺陷(在问题上对此发表了评论)。
猜你喜欢
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
相关资源
最近更新 更多