DataGridView 和 SqlDataAdapter 未正确更新

Posted

技术标签:

【中文标题】DataGridView 和 SqlDataAdapter 未正确更新【英文标题】:DataGridView and SqlDataAdapter not updating correctly 【发布时间】:2012-02-24 19:08:11 【问题描述】:

我一直在四处寻找,但我无法弄清楚这个问题来自哪里。发生的事情是我有一个使用 BindingSource、SqlDataAdapter、SqlCommandBuilder 和 DataTable 的 datagridview。 datagridview 填充了一个简单的选择查询(仅使用 MSSQL Server DB 中的一个表)。我希望能够编辑此表中的内容。现在,编辑工作,但不是它应该的方式。我认为我可以编辑一个单元格,按回车键,并将更改提交到数据库。实际发生的情况是,在我完成第二个单元格的编辑之前,这些更改不会出现。有人知道我在这里俯瞰什么吗?谢谢!

下面是.cs文件中的相关代码:

public partial class CheckIn : Form


    private BindingSource searchDGVBindingSource = new BindingSource();
    private SqlDataAdapter searchDGVDataAdapter;
    private SqlCommandBuilder searchDGVSqlCommandBuilder;
    private DataTable  searchDGVDataTable;


    public CheckIn()
    
        InitializeComponent();
        this.Load += new System.EventHandler(CheckIn_Load);
    

    private void CheckIn_Load(object sender, EventArgs e)
    
        searchDGV.DataSource = searchDGVBindingSource;
        searchDGVDataAdapter = new SqlDataAdapter(selectCommand, connectionString);
        searchDGVSqlCommandBuilder = new SqlCommandBuilder(searchDGVDataAdapter);
        searchDGVDataTable = new DataTable();
        searchDGVDataTable.Locale = System.Globalization.CultureInfo.InvariantCulture;
        searchDGVDataAdapter.Fill(searchDGVDataTable);
        searchDGVBindingSource.DataSource = searchDGVDataTable;

        searchDGV.AutoResizeColumns();
    

    private void searchGridView_RowEndEdit(object sender, DataGridViewCellEventArgs e)
    
        searchDGVDataAdapter.Update(searchDGVDataTable);
    

以下是 .Designer.cs 文件中的相关代码:

        // 
        // searchDGV
        // 
        this.searchDGV.AllowUserToAddRows = false;
        this.searchDGV.AllowUserToDeleteRows = false;
        this.searchDGV.BackgroundColor = System.Drawing.Color.White;
        this.searchDGV.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
        this.searchDGV.Location = new System.Drawing.Point(10, 250);
        this.searchDGV.MultiSelect = false;
        this.searchDGV.Name = "searchDGV";
        this.searchDGV.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
        this.searchDGV.Size = new System.Drawing.Size(619, 150);
        this.searchDGV.TabIndex = 7;
        this.searchDGV.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.searchGridView_CellClick);
        this.searchDGV.CellEndEdit += new System.Windows.Forms.DataGridViewCellEventHandler(this.searchGridView_RowEndEdit);

【问题讨论】:

有什么理由让CellEndEdit 事件被名为searchGridView_RowEndEdit 的方法处理? 我只是没有将 searchGridView_RowEndEdit 方法重命名为更合适的名称。我之所以这么命名,是因为我尝试了一种不同的方法。 您是否验证了您正在执行的更改实际上是有效的? 如果你在你的事件处理程序中放置断点,当你离开第一个单元格时它会停在那里吗? 有效更改是指对数据库有效吗?如果是这样,那么是的,它们是有效的。在这种情况下,我所做的只是更改名称——只是添加一个额外的字母作为一个简单的测试。 【参考方案1】:

您需要在您的事件处理程序中调用searchDGVBindingSource.EndEdit(),它会起作用:

private void searchGridView_RowEndEdit(object sender, DataGridViewCellEventArgs e)

    searchDGVBindingSource.EndEdit();
    searchDGVDataAdapter.Update(searchDGVDataTable);

查看documentation 以获取BindingSource.EndEdit() 以了解更多信息。

【讨论】:

成功了!我花了相当多的时间试图找到这个,谢谢!

以上是关于DataGridView 和 SqlDataAdapter 未正确更新的主要内容,如果未能解决你的问题,请参考以下文章

将列从一个 datagridview 和结果添加到另一个 datagridview

c# winform datagridview cellendedit 在datagridview的第一列输入编码,第二,三列自动取值,名称和规格

如何禁止datagridview列顺序自动改变位置

禁止DataGridView控件中添加和删除行

DataGridView 和 SqlDataAdapter 未正确更新

绑定 DataGridView 和 SQL 表