DataGridView与BindingSource内联编辑与存储过程

时间:2015-10-13 13:07:13

标签: c# stored-procedures datagridview

我有dataGridView1,DataSource定义为BindingSource:

    BindingSource bs = new BindingSource();
    bs.DataSource = dsGrid.Tables[0];
    dataGridView1.DataSource = bs;

其中dsGrid是使用存储过程从MSSQL DB读取的DataSet。 当我设置dataGridView1.ReadOnly = false时,用户可以内联编辑数据。

我希望在用户完成编辑后将整个编辑的行发送到存储过程,其中参数将被编辑数据。我该怎么办?

我有类,它在实际的SqlConnection上运行此过程。所以我的目标是挂钩发布数据和从网格读取编辑数据的时刻。我可以将它们发送给DB。

1 个答案:

答案 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);
    }
}

所以我手动完成了。不好,但功能上。