2

在我的 VS2015Winforms应用程序中,我创建了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;
        }
    }
4

1 回答 1

2

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

您可以创建 valid InsertCommandDeleteCommandUpdateCommandSqlDataAdapter使用 a SqlCommandBuilder,然后调用适配器的方法来保存对数据库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事件来手动处理适配器。

于 2016-03-17T22:41:52.790 回答