C# 在数据库c中更新后,选择值在Datagridview中保持选中状态?
我有一个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
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相同,反之亦然。我说得对吗?