DataGridView与BindingSource内联编辑与存储过程
本文关键字:编辑 存储过程 BindingSource DataGridView | 更新日期: 2023-09-27 18:17:23
我有dataGridView1与数据源定义为BindingSource:
BindingSource bs = new BindingSource();
bs.DataSource = dsGrid.Tables[0];
dataGridView1.DataSource = bs;
其中dsGrid是通过存储过程从MSSQL数据库读取的数据集。当我设置dataGridView1。ReadOnly = false,用户可以内联编辑数据。
我想在用户完成编辑后将整个编辑行发送到存储过程,其中参数将被编辑数据。我该怎么做呢?
我有一个类,它在实际的SqlConnection上运行这个过程。所以我的目标是钩住发布数据的时刻,并从网格中读取编辑过的数据。
我没有找到简单直接的解决办法。所以我添加了编辑列的DataGridViewButtonColumn类命名为动作,按钮与文本编辑。
int _rowIndex = -1;
bool _edited = false;
.
.
.
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 0) // it is button - column Action
{
if (_rowIndex >= 0) // not first editing
{
if (_rowIndex != e.RowIndex) // row change - cancel and begin elsewhere
{
// TODO: ask for save edited values
endInlineEdit(_rowIndex);
beginInlineEdit(e.RowIndex);
}
else // the same row
{
if (_edited) // is edited, so save
{
saveToDB(e.RowIndex);
}
else // repeating same row editation
{
beginInlineEdit(e.RowIndex);
}
}
}
else // editing first time
{
beginInlineEdit(e.RowIndex);
}
}
}
private void saveToDB(int rowIndex)
{
save to DB
...
endInlineEdit(rowIndex);
}
private void beginInlineEdit(int rowIndex)
{
dataGridView1.Rows[rowIndex].Cells[0].Value = "Save";
dataGridView1.CurrentCell = dataGridView1.Rows[rowIndex].Cells["FirstEditedColumn"];
dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;
dataGridView1.BeginEdit(true);
_rowIndex = rowIndex;
_edited = true;
}
private void endInlineEdit(int rowIndex)
{
dataGridView1.Rows[rowIndex].Cells[0].Value = "Edit";
dataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically;
dataGridView1.EndEdit();
_edited = false;
}
private void dataGridView1_RowLeave(object sender, DataGridViewCellEventArgs e)
{
if (_edited)
{
endInlineEdit(_rowIndex);
}
}
所以我手工做了。不是很好,但是功能很好。