C# 在更新或插入另一个表单时刷新 DataGridView

Posted

技术标签:

【中文标题】C# 在更新或插入另一个表单时刷新 DataGridView【英文标题】:C# refresh DataGridView when updating or inserted on another form 【发布时间】:2013-03-20 14:16:28 【问题描述】:

我有 2 个表格,分别是 form Aform B

form A 允许用户插入和更新学生信息。

form b 只是一个 DataGridView 和那里的按钮。

当我在form A 上插入学生,然后我转到form B,新学生没有显示在 DataGridView 上,如果我重新运行程序,新学生将出现在form B

我尝试在表单 b 上的按钮上使用此按钮

datagridview1.refresh();
datagridview1.update();

但它仍然无法正常工作。


已编辑:

我的插入工人的代码

cmd = new OleDbCommand("insert into FWINFOS (ID,Name,Gender,DateOfBirth,Race,WorkingPlace,PassportNO,DateOfExpire,[Position],Photo) values('" + textBox5.Text + "','" + textBox1.Text + "','" + textBox2.Text + "','" + dateTimePicker1.Value + "','" + textBox3.Text + "','" + textBox4.Text + "','" + textBox6.Text + "','" + dateTimePicker2.Value + "',@Position,@Photo)", con);


        cmd.Parameters.AddWithValue("@Position", comboBox1.SelectedText.ToString());
        conv_photo();

        con.Open();
        int n = cmd.ExecuteNonQuery();
        //cmd.ExecuteNonQuery();
        con.Close();
        if (n > 0)
        
            MessageBox.Show("Inserted");
            loaddata();

            rno++;
        
        else
            MessageBox.Show("No Insert");



    

我的Datagridview1(Form2) 在我插入新工作人员时不会自动更新。但如果我重新运行应用程序,新的工作人员就会出现。

【问题讨论】:

在表格 2 中提出一个事件,在表格 1 中处理它并再次为您的 gridview 检索数据 @NoviceProgrammer,我可以举个例子吗? 问题已解决。谢谢大家! 【参考方案1】:
// Form A
public void loaddata()

    //do what you do in load data in order to update data in datagrid

然后在表格 B 上定义:

// Form B
FormA obj = (FormA)Application.OpenForms["FormA"];

private void button1_Click(object sender, EventArgs e)

    obj.loaddata();
    datagridview1.Update();
    datagridview1.Refresh();

【讨论】:

所以我必须在表单 A 上创建一个按钮。还有其他方法吗? 您必须在表单 A 上触发一个新数据输入的事件,因此必须更新数据网格...必须在表单 A 中完成... 您可以将存储在Form A中的学生变量声明为public static,并在您点击Form B中的按钮时将其传递给Form B 对不起,我真的不明白,我可以举一些例子吗? 这意味着您重新加载所有数据...在这种情况下 DataBinding 不应该有帮助吗?【参考方案2】:

DataGridView.Refresh 和 And DataGridView.Update 是从 Control 继承的方法。它们与重绘控件有关,这就是新行不出现的原因。

我的猜测是数据检索在 Form_Load 上。如果您希望 Form B 上的 Button 从数据库中检索最新数据,那么无论 Form_Load 正在做什么,您都必须这样做。

一个很好的方法是将数据检索调用分离到一个单独的函数中,并从 From Load 和 Button Click 事件中调用它。

【讨论】:

【参考方案3】:

对于 C# 中的 datagridview,使用此代码

con.Open();
mysqlDataAdapter MyDA = new MySqlDataAdapter();
string sqlSelectAll = "SELECT * from dailyprice";
MyDA.SelectCommand = new MySqlCommand(sqlSelectAll, con);

DataTable table = new DataTable();
MyDA.Fill(table);

BindingSource bSource = new BindingSource();
bSource.DataSource = table;


dataGridView1.DataSource = bSource;
con.Close();

它适用于在 datagridview 中显示新记录。

【讨论】:

对我有用的是调用 DataAdapter 的 .Fill() 方法(不需要其他任何东西来导致 DataGridView 的刷新)。确保在调用 Fill 之前正确设置 ClearBeforeFill 属性。【参考方案4】:

在您只需要此代码的任何地方刷新数据网格视图:

datagridview1.DataSource = "your DataSource";
datagridview1.Refresh();

【讨论】:

【参考方案5】:

我的 datagridview 是 editonEnter 模式。所以它只有在我离开单元格或我重新访问并退出单元格两次后才会刷新。

立即触发。我从 datagridview 中解脱出来。然后重新聚焦它。

 this.SelectNextControl(dgv1,true,true,false,true);    
 Application.DoEvents();    //this does magic
 dgv1.Focus();

【讨论】:

【参考方案6】:

举一个简单的例子,应该是一个足够的起点

表格 A 中的代码

public event EventHandler<EventArgs> RowAdded;

private void btnRowAdded_Click(object sender, EventArgs e)

     // insert data
     // if successful raise event
     OnRowAddedEvent();


private void OnRowAddedEvent()

     var listener = RowAdded;
     if (listener != null)
         listener(this, EventArgs.Empty);

表格 B 中的代码

private void button1_Click(object sender, EventArgs e)

     var frm = new Form2();
     frm.RowAdded += new EventHandler<EventArgs>(frm_RowAdded);
     frm.Show();


void frm_RowAdded(object sender, EventArgs e)

     // retrieve data again

您甚至可以考虑创建自己的EventArgs 类来包含新添加的数据。然后您可以使用它直接将数据添加到 DatagridView 中的新行

【讨论】:

在您的MessageBox.Show("Inserted"); 致电OnRowAddedEvent(); 后确保您以其他形式订阅该活动 我们可以在Skype或msn上交谈吗? skype : JKT msn : junkai2595@hotmail.com void frm_RowAdded(object sender, EventArgs e) // 再次检索数据 抱歉耽搁了,您需要将绑定数据网格的逻辑再次放在这里 - 所以您调用的填充网格的任何方法都需要再次调用。【参考方案7】:

我想做同样的事情。

  public static bool update = false;
  Timer t = null;
  private void RefreshTable()
  
     t = new Timer();
     t.Interval = 1000;
     t.Tick += new EventHandler(t_Tick);
     t.Enabled = true;
  

  void t_Tick(object sender, EventArgs e)
  
     if (update)
        
           dataGridView.Rows.Clear();
           dataGridView.Refresh();
           setCustomerDetailsTable();
           update = false;
        
   

我在包含 dataGridView 的表单中使用一个静态变量,并从表单 A 访问它。当用户插入或更新详细信息时,我设置了 update 变量 true 以便下次计时器计时时表更新并设置 update 为假。这可以防止它每次更新计时器滴答声。在我的例子中,setCustomerDetailsTable() 是最初在 Form_Load 上加载数据的函数。我确信这不是最好的方法。但是,我也使用此计时器在 UI 上显示时钟。所以我也给它分配了这个任务。当我在 Form_Load 上调用 RefreshTable() 时,它会执行我想要的操作。

【讨论】:

【参考方案8】:

创建一个小函数并在任何地方使用它

public SqlConnection con = "Your connection string"; 
public void gridviewUpdate()

    con.Open();
    string select = "SELECT * from table_name";
    SqlDataAdapter da = new SqlDataAdapter(select, con);
    DataSet ds = new DataSet();
    da.Fill(ds, "table_name");
    datagridview.DataSource = ds;
    datagridview.DataMember = "table_name";
    con.Close();

【讨论】:

以上是关于C# 在更新或插入另一个表单时刷新 DataGridView的主要内容,如果未能解决你的问题,请参考以下文章

当另一个表单关闭时如何刷新一个表单?

使用来自另一个表单的数据更新 datagridview (C#)

在注册表单上插入 -> 更新另一个表中的相应值

当在 asp.net 中插入更新的记录而不刷新页面时,如何自动更新 Gridview?

c#如何使用委托 触发另一个窗体的按钮刷新另一窗体

在 C# 中刷新数据视图网格