.NET Winforms BindingNavigator 添加和删除按钮不起作用

Posted

技术标签:

【中文标题】.NET Winforms BindingNavigator 添加和删除按钮不起作用【英文标题】:.NET Winforms BindingNavigator Add and Delete buttons do not work 【发布时间】:2016-03-17 18:20:27 【问题描述】:

在我的 VS2015 Winforms 应用程序中,我创建了一个 DataGridView 和一个 BindingNavigator。以下代码成功显示 DataGridView 中的数据,我可以使用 BindingNavigator 导航数据行。但是当我尝试使用 BindingNavigator 上的内置添加/删除按钮添加/删除一行时,数据库不会反映这些更改。

守则

public partial class Form2 : Form
    
        public Form2()
        
            InitializeComponent();
        
        SqlDataAdapter dadapter;
        DataSet dset;
        BindingSource bs;
        string connstring = "database=emp;server=.;user=sa;password=wintellect";
        private void Form2_Load(object sender, EventArgs e)
        
            dadapter = new SqlDataAdapter("select * from emp_detail", connstring);
            dset = new DataSet();
            dadapter.Fill(dset);
            bs = new BindingSource();
            bs.DataSource = dset.Tables[0].DefaultView;
            bindingNavigator1.BindingSource = bs;
            dataGridView1.DataSource = bs;
        
    

【问题讨论】:

您应该创建用于保存更改的代码。 数据库?它所做的(并且一直在做的)就是从DataTable 中删除DataRow。这是内存结构。 DataTable 中的更改通过 DataAdapter 反映到数据库。 DataAdapter 必须包含正确的 Insert、Update、Delete 命令定义(在当前情况下,此命令可以自动生成)并且在用户端编辑后您应该调用 Update 方法:msdn.microsoft.com/en-us/library/xzb1zw3x.aspx 【参考方案1】:

您忘记将更改保存到数据库。当您添加、删除或编辑 DataGridView 的项目时,所有更改都在内存中的底层数据源中进行,并且要持久保存更改,您应该将这些更改保存到数据库中。

您可以使用SqlCommandBuilderSqlDataAdapter创建有效的InsertCommandDeleteCommandUpdateCommand,然后调用适配器的Update方法将DataTable的更改保存到数据库:

SqlDataAdapter adapter;
DataSet table;
BindingSource bs;

private void Form1_Load(object sender, EventArgs e)

    var connection = "Your Connection String";
    var command = "SELECT * FROM SomeTable"
    adapter = new SqlDataAdapter(command, connstring);
    this.components.Add(adapter);
    table= new DataTable();

    //This line creates valid insert, update and delete commands for data adapter
    var commandBuilder = new SqlCommandBuilder(myTableAdapter);

    dadapter.Fill(table);
    bs = new BindingSource();
    bs.DataSource = table;
    bindingNavigator1.BindingSource = bs;
    dataGridView1.DataSource = bs;


private void SaveButton_Click(object sender, EventArgs e)

    this.Validate();
    this.dataGridView1.EndEdit();
    adapter.Update(table);

注意:我之所以这样做this.components.Add(adapter);是因为我们不应该忘记处置SqlDataAdapter。通过将其添加到表单的components 容器中,它将被自动释放。

如果您在没有设计器的情况下创建了表单,您可能没有components 容器。在这种情况下,请通过覆盖表单的 Dispose 或在 Closing 事件中手动处置适配器。

【讨论】:

以上是关于.NET Winforms BindingNavigator 添加和删除按钮不起作用的主要内容,如果未能解决你的问题,请参考以下文章

哪个日志实用程序适用于 C#(ASP.NET、WinForms)中的 .NET 应用程序? [关闭]

在.NET(Winforms)中的表单中居中控件?

所有循环崩溃winforms vb.net?

为啥我的 .Net/WinForms 应用程序仅在 Visual Studio 中获得跨线程异常? [复制]

带有 WinForms .NET 时间线的交互式图表 [关闭]

使用 PostgreSql 和 ADO.NET 在 C# WinForms 中锁定记录和表