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上运行这个过程。所以我的目标是钩住发布数据的时刻,并从网格中读取编辑过的数据。

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

我没有找到简单直接的解决办法。所以我添加了编辑列的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);
    }
}

所以我手工做了。不是很好,但是功能很好。