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

本文关键字:表单 刷新 DataGridView 另一个 更新 插入 | 更新日期: 2023-09-27 18:04:57

我有两种形式是form Aform B

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

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

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

我试着在表单b上使用这个on按钮

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

但是它仍然不能工作。


编辑:

插入worker 的代码
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");

    }
当我插入一个新的worker时,我的Datagridview1(Form2)不会自动更新。但是如果我重新运行应用程序,就会出现新的worker。

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

// Form A
public void loaddata()
{
    //do what you do in load data in order to update data in datagrid
}

then on Form B define:

// Form B
FormA obj = (FormA)Application.OpenForms["FormA"];
private void button1_Click(object sender, EventArgs e)
{
    obj.loaddata();
    datagridview1.Update();
    datagridview1.Refresh();
}

DataGridView.RefreshDataGridView.Update是继承自Control的方法。它们与重绘控件有关,这就是为什么不出现新行。

我猜数据检索是在Form_Load。如果你想让表单B上的按钮从数据库中检索最新的数据,那么你就必须做Form_Load正在做的事情。

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

对于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();

用于在任何您只需要的地方刷新数据gridview

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

我的datagridview是editonEnter模式。所以它只在我离开cell或在我重新访问并退出cell两次之后刷新。

立即触发此操作。我将焦点从datagridview移开。然后重新对焦。

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

放一个简短的例子,应该是一个足够的起点

表格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

中的新行中。

我也想做同样的事情。

  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()时,它会做我想要的。

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

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();
}