c#在更新或插入到另一个表单时刷新DataGridView
本文关键字:表单 刷新 DataGridView 另一个 更新 插入 | 更新日期: 2023-09-27 18:04:57
我有两种形式是form A
和form 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。
// 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.Refresh
和DataGridView.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();
}