c# - C# 使用 MySqlDataAdapter 作为 DataSource 时保持选择 DataGrid
问题描述
我的目标是在刷新数据后保持选择。
这是我当前的代码如何将数据加载到数据网格视图中。
public void RefreshGrid()
{
try
{
// MySQL connection string
using (var conn = new MySqlConnection(ConnectionString.ConnString))
{
using (var mySqlDataAdapter = new MySqlDataAdapter("select id, customer from table;", conn))
{
using (var dataSet = new DataSet())
{
DataSet DS = new DataSet();
mySqlDataAdapter.Fill(DS);
labelOrderData.DataSource = DS.Tables[0];
labelOrderData.Columns[0].HeaderText = "ID";
labelOrderData.Columns[1].HeaderText = "Customer";
labelOrderData.Columns[0].Visible = false;
}
}
}
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString(), "Refresh - Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
这就是我刷新的方式。
private void refreshBtn_Click(object sender, EventArgs e)
{
RefreshGrid();
}
问题
刷新数据后如何保持选择?
我试过这个: https ://www.codeproject.com/Questions/149500/c-Datagrid-retain-Cell-focus-after-refresh
但这对我不起作用。这是因为有一点DataGridView是空的,没有数据,因为这两行代码就报错了
int cell1 = (this.agentsDataGridView.CurrentCell.RowIndex);
int cell2 = (this.agentsDataGridView.CurrentCell.ColumnIndex);
无效/未选择。
解决方案
您可能应该使用实际数据而不是索引来选择刷新后要选择的行,因为可能已经添加或删除了行,或者可能无法保证行的顺序。我建议这样做:
public void RefreshGrid(int selectedID)
{
try
{
// MySQL connection string
using (var conn = new MySqlConnection(ConnectionString.ConnString))
{
using (var mySqlDataAdapter = new MySqlDataAdapter("select id, customer from table;", conn))
{
using (var dataSet = new DataSet())
{
DataSet DS = new DataSet();
mySqlDataAdapter.Fill(DS);
labelOrderData.DataSource = DS.Tables[0];
labelOrderData.Columns[0].HeaderText = "ID";
labelOrderData.Columns[1].HeaderText = "Customer";
labelOrderData.Columns[0].Visible = false;
}
}
foreach(DataGridViewRow row in labelOrderData.Rows)
{
if((int)row.Cells[0].Value == selectedID)
{
row.Selected = true;
break;
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "Refresh - Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
然后在您的刷新按钮单击事件中:
private void refreshBtn_Click(object sender, EventArgs e)
{
int selectedID = -1;
if (labelOrderData.SelectedRows.Count > 0)
{
selectedID = (int)labelOrderData.SelectedRows[0].Cells[0].Value;
}
RefreshGrid(selectedID);
}
该代码假定您的 ID 永远不会小于零,并且 ID 是唯一的整数。如果它们是其他东西,例如字符串,则根据需要进行调整,它仍然可以工作。
推荐阅读
- regex - 如何使用正则表达式解析可变长度命令行参数?
- java - 如何手动记录 JAX-RS 参数的 Swagger 数据模型?
- python-3.x - 字符串缓冲区无法将数据写入数据库表
- python - 如何实现与 Matlab 的 ode15s 相同的可变步长 Python 积分器?
- c# - Google Play 服务 - 不再与 IL2CPP 一起正常工作
- xml - filebeat中嵌套xml文件的多行模式-logstash 7.0.1
- angular - 如何为移动版本的组件制作单独的 .html 和 .scss 文件?
- vba - 创建重命名文件的快捷方式
- javascript - 为什么我不能使用钩子在我的状态下设置值?
- python - 如何获取给定 URL 的整页屏幕截图?