16

我有 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)的不会自动更新。但是如果我重新运行应用程序,新的工作人员就会出现。

4

8 回答 8

23
// 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();
}
于 2013-03-20T14:22:03.737 回答
5

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

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

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

于 2013-03-20T14:38:18.183 回答
5

对于 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 中显示新记录。

于 2016-11-10T18:55:17.620 回答
4

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

datagridview1.DataSource = "your DataSource";
datagridview1.Refresh();
于 2016-11-26T14:24:35.210 回答
4

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

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

 this.SelectNextControl(dgv1,true,true,false,true);    
 Application.DoEvents();    //this does magic
 dgv1.Focus();
于 2017-08-23T13:00:31.807 回答
2

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

表格 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 中的新行

于 2013-03-20T15:33:07.043 回答
0

我想做同样的事情。

  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为 false 时。这可以防止它每次更新计时器滴答声。在我的例子中,这setCustomerDetailsTable()是最初在 Form_Load 上加载数据的函数。我确信这不是最好的方法。但是,我也使用此计时器在 UI 上显示时钟。所以我也给它分配了这个任务。当我调用RefreshTable()Form_Load 时,它会执行我想要的操作。

于 2021-12-07T18:33:19.077 回答
-1

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

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();
}
于 2020-08-20T15:37:33.797 回答