可以';t更新C#中的datagridview和form元素
本文关键字:datagridview 中的 form 元素 更新 可以 | 更新日期: 2023-09-27 18:30:05
在C#中,使用Visual Studio Express 2013,我正试图从事件处理程序更新数据网格视图,以进行按钮单击。该按钮是一个提交按钮,用于更新Sqlite数据库,然后更新datagridview以反映更改。问题是,在我更新Sqlite数据库(更新成功)后,datagridview不会从事件处理程序中更新(这是在getLoggedData(employeeNumber,false)引用中设置的)。(我还尝试更新了一个文本框,但没有更新)。在数据网格视图应该更新之后,我添加了一个thread.sleep,这样用户就可以看到数据网格视图重置之前所做的更改(按钮最后一行的getLoggedData()点击重置数据网格视图)。
getLoggedData(employeeNumber,false)方法只获取sqlite数据库作为数据表,并将其设置为dgvLogged的数据源。check列和addRow不应该与问题相关。
顺便说一句,我已经尝试过使用绑定源,但没有成功。
// This is when the button submit is clicked
private void btnConfirmEntry_Click(object sender, EventArgs e)
{
modifyEmployeeJobs();
getLoggedData(employeeNumber, false);
Thread.Sleep(2000);
getLoggedData();
}
public void getLoggedData(string empID, bool addRow)
{
dgvColumnNumberAdder = 1; // Adds a 1 to the index if the checkboxes are present in the datagridview
MySql sql = new MySql();
try
{
dgvLogged.Columns.Clear();
DataGridViewCheckBoxColumn checkColumn = new DataGridViewCheckBoxColumn();
checkColumn.Name = "Check";
checkColumn.HeaderText = "";
checkColumn.Width = 50;
checkColumn.ReadOnly = false;
checkColumn.FillWeight = 10; //if the datagridview is resized (on form resize) the checkbox won't take up too much; value is relative to the other columns' fill values
checkColumn.MinimumWidth = 30;
dgvLogged.Columns.Add(checkColumn);
DataTable dt = sql.getLoggedData(empID);
if (addRow)
{
// Add row to datatable for job information that was just received
DataRow row;
row = dt.NewRow();
row["EmpID"] = employeeNumber;
row["Job"] = jobNumber;
row["WorkCode"] = workCode;
row["JobState"] = "Pending";
dt.Rows.Add(row);
}
dgvLogged.DataSource = dt;
dgvLogged.Columns[jobTrackingColumnNumbers["ID"] + dgvColumnNumberAdder].Visible = false;
setCheckStates();
dgvLogged.Visible = true;
txtInstructions.Visible = false;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
问题之所以发生,是因为您正在对UI按钮事件执行Thread.Sleep()
-这会锁定发生按钮事件的线程,直到睡眠完成。
您不希望在UI中进行线程睡眠。如果你想让用户能够导航2秒,你可以启动System.Timer
,它在经过后完成你想要做的其余逻辑。在该按钮调用内睡眠将锁定UI,因为UI线程仍在运行,而你正在睡眠,所以你正在等待睡眠完成(在该线程上),然后再进入下一步,即重新绑定数据。
我想不出有什么理由睡在UI线程上,UI只是用来显示的,所以你想通过事件和调用来触发对它的更新。请记住,表单是一个多线程环境,即使您没有管理这些线程。