C# 在数据库c中更新后,选择值在Datagridview中保持选中状态?

C# 在数据库c中更新后,选择值在Datagridview中保持选中状态?,c#,ms-access,datagridview,datatable,oledb,C#,Ms Access,Datagridview,Datatable,Oledb,我有一个dataGridView,它从数据库获取所有数据。 我所做的是创建一个方法来显示所有数据,但问题是,调用该方法后,滚动返回到顶部,这是我不希望发生的。我创建这个方法是为了显示新添加的数据和更新颜色 private void showAllData() { try { using (OleDbConnection conn = new OleDbConnection(GlobalVar.connectionString

我有一个dataGridView,它从数据库获取所有数据。 我所做的是创建一个方法来显示所有数据,但问题是,调用该方法后,滚动返回到顶部,这是我不希望发生的。我创建这个方法是为了显示新添加的数据和更新颜色

    private void showAllData()
    {
        try
        {
            using (OleDbConnection conn = new OleDbConnection(GlobalVar.connectionString))
            using (OleDbDataAdapter sda = new OleDbDataAdapter("SELECT * FROM tblTest", conn))
            {
                DataTable dt = new DataTable();
                sda.Fill(dt);

                dataGridView1.DataSource = dt;

                for (int x = 0; x < dataGridView1.RowCount; x++)
                {
                    if (dataGridView1.Rows[x].Cells["Color"].Value == "Green")
                        dataGridView1.Rows[x].DefaultCellStyle.BackColor = Color.Green;
                    else
                        dataGridView1.Rows[x].DefaultCellStyle.BackColor = Color.Red;
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    private void btnAdd_Click(object sender, EventArgs e)
    {
        try
        {
            using (OleDbConnection conn = new OleDbConnection(GlobalVar.connectionString))
            using (OleDbCommand cmd = new OleDbCommand("INSERT INTO tblTest (Color) VALUES ('Red')", conn))
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        //Update dataGridView1 BackColor
        showAllData();
    }

    private void btnUpdate_Click(object sender, EventArgs e)
    {
        try
        {
            using (OleDbConnection conn = new OleDbConnection(GlobalVar.connectionString))
            using (OleDbCommand cmd = new OleDbCommand("UPDATE tblTest SET Color = 'Green' WHERE id = " + dataGridView1.SelectedRows[0].Cells[0].Value, conn))
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        //Update dataGridView1 BackColor
        showAllData();
    }
使用DataGridView.FirstDisplayedScrollingRowIndex属性。它设置作为DataGridView上显示的第一行的行的索引

在您的情况下,因为您正在更改数据源,所以可能已经添加了新行。不能使用已选择的行索引。您必须使用任何唯一标识符标识先前选择的行,并获取其索引,并将上述属性设置为此索引号

您也可以使用DataTable将查询表与现有表合并,而不是重置数据源。使用DataGridView.refresh合并并刷新网格

或者您可以再次填充原始数据表

DataTable origTable = dataGridView1.DataSource as DataTable;
sda.Fill(origtable);
dataGridView1.Refresh();

您只需在刷新后设置CurrentCell:

var ptCurrentCell = this.DataGridView1.CurrentCellAddress();
-进行数据刷新

Refresh();
-现在重置当前单元格

this.DataGridView1.CurrentCell = this.DataGridView1.Rows(ptCurrentCell.Y).Cells(ptCurrentCell.X);

这是我第一次做的,但这是唯一的解决办法吗?有没有一种方法可以让我不更改数据源,然后刷新我的数据网格?我有点困惑,我将在哪里添加这个数据表。合并。@ViFer-我再次编辑了我的答案。我假设原始数据源是一个DataTable。@ViFer-不填充新的DataTable,而是填充分配给datasource的表,请参见我的编辑。这样就不需要再合并了吗?我关心的是保留卷轴。我已经完成了这个尝试,看起来与DataGridView.FirstDisplayedScrollingRowIndex相同,反之亦然。我说得对吗?