我有一个使用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: '$0.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);
}
}
答案 0 :(得分:2)
在您的问题中,您已将数据分配给accountGridView.DataSource
。所以你不能指望绑定导航器工作。 BindingSource
未与数据相关联,BindingNavigator
和DataGridView
未与BindingSource.
您应该使用设计器或代码执行这些设置:
DataSource
的{{1}}属性。 (使用代码)BindingSource
分配给BindingSource
DataSource
属性
DataGridView
分配给BindingSource
的{{1}}属性。注意强>
更改查询与绑定源无关。无论适配器或提供/保存数据的任何内容如何,BindingSource
和BindingNavigator
都能正常工作。 BindingSource
和BindingNavigator
都不知道数据实际来自何处以及如何保存数据。
答案 1 :(得分:0)
我刚刚通过创建一个新的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
{
}
答案 2 :(得分:0)
后代:
与真正的Button控件不同,BindingNavigator的按钮是轻型控件。
当您单击BindingNavigator中的任何按钮时,Focus不会从当前的Control中被窃取,因此,导致数据被推送到基础数据库的事件序列永远不会被调用。
我知道我有一个示例示例,您必须在每个轻量级按钮的Click处理程序中放入几行代码,但暂时找不到。
这一直是PITA!