更新 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。
我尝试更新 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。