首页 > 解决方案 > 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);

无效/未选择。

标签: c#

解决方案


您可能应该使用实际数据而不是索引来选择刷新后要选择的行,因为可能已经添加或删除了行,或者可能无法保证行的顺序。我建议这样做:

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 是唯一的整数。如果它们是其他东西,例如字符串,则根据需要进行调整,它仍然可以工作。


推荐阅读