【问题标题】:Selected value to stay selected in Datagridview after updating in database c#?在数据库c#中更新后,选择的值在Datagridview中保持选中状态?
【发布时间】:2014-03-06 07:35:03
【问题描述】:

我有一个 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();
    }

【问题讨论】:

    标签: c# ms-access datagridview datatable oledb


    【解决方案1】:

    使用DataGridView.FirstDisplayedScrollingRowIndex 属性。它设置 DataGridView 上显示的第一行的行的索引。

    在您的情况下,由于您要更改 DataSource,因此可能已添加新行。您不能使用已选择的行索引。您必须识别之前选择的行(使用任何唯一标识符)并获取其索引并将上述属性设置为此索引号。

    除了重置DataSource,您还可以使用DataTable.Merge 将查询表与现有表合并,并使用DataGridView.Refresh 刷新网格。

    或者你可以重新填充原来的DataTable。

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

    【讨论】:

    • 这是我首先做的,但这是唯一的解决方法吗?有没有办法让我不更改 Datasource 然后刷新我的数据网格?
    • 我有点困惑,我在哪里添加这个DataTable.Merge
    • @ViFer - 我再次编辑了我的答案。我假设原始数据源是一个 DataTable。
    • @ViFer - 而不是填充新的 DataTable 填充分配给数据源的表(请参阅我的编辑)。
    • 所以不再需要合并了?我关心的是保留卷轴。
    【解决方案2】:

    您只需要在刷新后设置 CurrentCell:

    var ptCurrentCell = this.DataGridView1.CurrentCellAddress();
    

    --刷新数据

    Refresh();
    

    --现在重置当前单元格

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

    【讨论】:

    • 我已经完成了这个尝试,似乎与DataGridView.FirstDisplayedScrollingRowIndex 相同,反之亦然。我说的对吗?
    猜你喜欢
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 2017-09-17
    • 2016-03-21
    • 2020-12-18
    • 2014-06-14
    相关资源
    最近更新 更多