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

可以';t更新C#中的datagridview和form元素

问题之所以发生,是因为您正在对UI按钮事件执行Thread.Sleep()-这会锁定发生按钮事件的线程,直到睡眠完成。

您不希望在UI中进行线程睡眠。如果你想让用户能够导航2秒,你可以启动System.Timer,它在经过后完成你想要做的其余逻辑。在该按钮调用内睡眠将锁定UI,因为UI线程仍在运行,而你正在睡眠,所以你正在等待睡眠完成(在该线程上),然后再进入下一步,即重新绑定数据。

我想不出有什么理由睡在UI线程上,UI只是用来显示的,所以你想通过事件和调用来触发对它的更新。请记住,表单是一个多线程环境,即使您没有管理这些线程。