更新 DataGridView 选定的行

Updating DataGridView Selected Rows

我尝试更新 DataGridView 中的选定行,但结果很奇怪,它总是缺少一行或另一行。问题是当我点击 btnSettled 按钮设置结算日期,然后点击 btnUpdate 更新数据库,结果似乎没问题,但是点击 btnRefresh 刷新 DGV 后,总是缺少一行。这是 UpdateCommand 或 foreach 循环的问题吗?请帮我解决这个问题。谢谢。

在点击 btnSettle 之前

点击 btnSettled 和 btnUpdate 后

点击 btnRefresh 后

我的代码如下:

DataTable dtTrx = new DataTable();
SqlDataAdapter daTrx = new SqlDataAdapter();
DataSet dsTrx = new DataSet();

    public Form1()
    {
        InitializeComponent();
        getData();
    }

    private void getData()
    {
        string strConn = "Data Source=.\xpw;Initial Catalog=MyStock;Integrated Security=True;";
        SqlConnection conn = new SqlConnection(strConn);
        conn.Open();

        string sqlTrx = "SELECT TrxID, TrxDate,Ticker,Qty,Price,Type,AccID, SettledDate,BrokerUserID FROM Trx";

        daTrx = new SqlDataAdapter(sqlTrx, conn);
        SqlCommandBuilder cbTrx = new SqlCommandBuilder(daTrx);
        daTrx.Fill(dsTrx, "trx");

        conn.Close();

        dtTrx = dsTrx.Tables["trx"];
        dgvTrx.DataSource = dtTrx;
    }

    private void btnUpdate_Click(object sender, EventArgs e)
    {
        daTrx.Update(dsTrx, "trx");
    }

    private void btnRefresh_Click(object sender, EventArgs e)
    {
        dsTrx.Clear();
        daTrx.Fill(dsTrx, "trx");
    }

    private void btnSettled_Click(object sender, EventArgs e)
    {
        foreach (DataGridViewCell c in dgvTrx.SelectedCells)
        {
            dgvTrx[7, c.RowIndex].Value = "2017/7/23";
        }
    }

首先,您需要开始使用参数化 SQL 查询。

其次,我没有发现你的代码有问题,但你试试这个:

private void btnSettled_Click(object sender, EventArgs e)
{
    foreach (DataGridViewRow r in dgvTrx.SelectedRows)
    {
        r.Cells["SettledDate"].Value = "2017/7/23"; //use the column name instead of column index
    }
    this.BindingContext[dgvTrx.DataSource].EndCurrentEdit(); 
    //the above line is added to improve the solution
    //as per the link mentioned in the accepted answer
}

这种方法背后的原因是,现在即使更改列位置,也不必重新编写代码来匹配更改

由于您正在使用 SelectedCells,因此除非您将鼠标拖到最后一个 Cell,否则它不会被添加到 SelectedCell 集合中

注意:在 r.Cells["SettledDate"].Value 中,我假设列名是 SettledDate

最后我在 :

中找到了解决方案

Programmingly udpating selected rows misses the last one in dgv.DataSource.GetChanges()?

只需要结束编辑foreach循环后的最后一行:

this.BindingContext[dgvTrx.DataSource].EndCurrentEdit();       

再次感谢@Nobody。