2017-07-25 115 views
0

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

之前单击btnSettle before click btnSettled

后单击btnSettled和btnUpdate 单击btnRefresh after click btnRefresh

我的代码after click btnSettled and btnUpdate

依次如下:

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"; 
     } 
    } 
+0

注意:如果我在DGV上手动编辑SettledDate,然后单击更新并刷新,结果是确定的。 – xpw

+1

这将是更好的循环像'foreach(DataGridViewRow在dgvTrx.SelectedRows)'然后应用该值通过使用'r.Cells [“SettledDate”]。Value =“2017/7/23”;' –

+0

getData )应该在foreach循环之后触发,以便更新gridview以便发言 – Taco2

回答

1

首先你需要开始使用参数化的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

+0

是的,你的方式更优雅来维护代码。但不幸的是结果是一样的 - 缺少一行。谢谢。 – xpw

+0

我很抱歉听到这些消息,但我现在测试了我的代码片段并正在为我工​​作。反正lemme再次看你的代码 –

+0

选定的行全部突出显示,我认为它清楚地表明哪些行被选中。 – xpw