我有dataGridView1,DataSource定义为BindingSource:
BindingSource bs = new BindingSource();
bs.DataSource = dsGrid.Tables[0];
dataGridView1.DataSource = bs;
其中dsGrid是使用存储过程从MSSQL DB读取的DataSet。 当我设置dataGridView1.ReadOnly = false时,用户可以内联编辑数据。
我希望在用户完成编辑后将整个编辑的行发送到存储过程,其中参数将被编辑数据。我该怎么办?
我有类,它在实际的SqlConnection上运行此过程。所以我的目标是挂钩发布数据和从网格读取编辑数据的时刻。我可以将它们发送给DB。
答案 0 :(得分:1)
我没有找到简单直接的解决方案。所以我添加了名为Action的DataGridViewButtonColumn类的编辑列,带有文本Edit的按钮。
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);
}
}
所以我手动完成了。不好,但功能上。