如何设置 BindingNavigator? - BindingNavigator 不工作

How to set up BindingNavigator? - BindingNavigator is not working

我有一个使用 BindingNavigator 的数据应用程序。我已将导航器连接到绑定源,但它不起作用。它不会添加或删除行。绑定源为:accountBindingSource。我不明白哪里出了问题。我有以下代码:

public partial class AccountDataGridView : Form
{
    public AccountDataGridView()
    {
        InitializeComponent();
        Setup();
    }

    private void AccountDataGridView_Load(object sender, EventArgs e)
    {
        // Change the back color of the first column. This can also be changed in the designer
        accountGridView.Columns[0].DefaultCellStyle.BackColor = Color.FromArgb(192, 192, 255);
    }

    private void Setup()
    {
        // Define a global variable for the data table
        Account = new DataTable(Text);
        query = string.Format("SELECT * FROM {0}", Text);
        // Establish a connection between the Database and the form
        conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Tutoring Database.accdb;Persist Security Info=False");
        conn.Open();
        // Setup data table
        OleDbDataAdapter accountAdapter = new OleDbDataAdapter(query, conn);
        if (accountAdapter != null)
        {
            accountAdapter.Fill(Account);
        }
        accountGridView.DataSource = Account;

        conn.Close();
    }

    private void DataErrorRaised(object sender, DataGridViewDataErrorEventArgs e)
    {
        // Data table error handling. This is triggered when the user attempts to input invalid data into the CurrentBalance column
        MessageBox.Show("You have entered an invalid data type for the currency column. Please enter text formatted like so: '[=10=].00'",
            "Account Error", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
    }

    private void btnSave_Click(object sender, EventArgs e)
    {
        // Update Access Database
        try
        {
            adapter.SelectCommand = new OleDbCommand(query, conn);
            adapter.InsertCommand = new OleDbCommand(query, conn);
            adapter.DeleteCommand = new OleDbCommand(query, conn);
            OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);

            adapter.Update(Account);
            Console.WriteLine("Saved");
        }

        catch
        {

        }
    }

    private DataTable Account;
    private string query;
    private OleDbConnection conn;
    private OleDbDataAdapter adapter = new OleDbDataAdapter();

    private void accountGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        btnSave_Click(null, null);
    }
}

我刚刚通过创建一个新的 BindingSource 并通过代码设置其属性解决了我的问题。为此,只需将 BindingSource 拖到窗体上即可。随心所欲地命名。在您的解决方案的代码部分中,键入与此类似的内容(在构造函数中)。

BindingSource.DataSource = Account;

确保将 BindingNavigator 的 BindingSource 设置为您刚刚创建的 BindingSource。谢谢大家的帮助!

编辑:我不知道这是否与我的解决方案有关,但我也稍微编辑了我的查询。此代码是项目运行所必需的。

try
{
    adapter.SelectCommand = new OleDbCommand(query, conn);
    adapter.InsertCommand = new OleDbCommand("INSERT INTO Account (AccountNumber, LastName, FirstName, CurrentBalance) " +
    "VALUES (?, ?, ?, ?)", conn);
    adapter.DeleteCommand = new OleDbCommand(query, conn);
    OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);

    adapter.Update(Account);
    Console.WriteLine("Saved");
}
catch
{
}

在您的问题中,您将数据分配给 accountGridView.DataSource。所以你不能指望绑定导航器工作。 BindingSource 未连接到数据,BindingNavigatorDataGridView 未连接到 BindingSource.

您应该使用设计器或代码执行这些设置:

  • 加载数据并将数据分配给 BindingSourceDataSource 属性。 (使用代码)
  • BindingSource 分配给 DataGridView
  • DataSource 属性
  • BindingSource 分配给 BindingNavigatorBindingSource 属性。

备注

更改查询与绑定源无关。 BindingSourceBindingNavigator 工作与适配器或任何 provides/saves 数据无关。 BindingSourceBindingNavigator 都不知道数据实际来自哪里以及数据将如何保存。

为了后代:

BindingNavigator 的按钮是轻量级控件,与真正的 Button 控件不同。

当您单击 BindingNavigator 中的任何按钮时,不会从当前控件中窃取焦点,因此不会调用导致数据被推送到基础数据库的事件序列。

我知道我有一个示例,其中包含您必须放入每个轻量级按钮的点击处理程序中的几行代码,但目前找不到。

这一直是 PITA!