根据Combobox值更新DataGridView
本文关键字:DataGridView 更新 Combobox 根据 | 更新日期: 2023-09-27 18:18:04
我有一个带有组合框和datagridview控件的表单。组合框由数据库表填充,并存储Transaction ID。
当组合框更新时,Datagridview被绑定到一个数据库表,并显示与组合框中的事务ID相关联的记录。
cboTransaction_SelectionChangeCommitted(object sender, EventArgs e)
{
int id = Convert.ToInt32(cboTransaction.SelectedValue);
db.Items.Where(i => i.TransactionId == id).Load();
bs.DataSource = db.Items.Local.ToBindingList();
dgv.DataSource = bs;
}
对于第一个记录,这可以正常工作。用户可以选择事务ID并在DataGridView中添加/编辑Item记录,而不会出现问题。
但是,当用户从组合框中选择不同的事务时,事情就变得有点混乱了。使用上面的代码,DataGridView不清除旧ID号的行,而是显示旧记录+新选择的事务的任何记录。我假设Where()子句会将DataGridView限制为那些与Transaction ID匹配的项目。如果我将db.SaveChanges();
和dgv.Rows.Clear();
添加到该块的开头,则行被成功清除,但是更改不会保存到数据库中。
我也试过
db.Items.Load();
bs.DataSource = db.Items.Local.ToBindingList().Where(i => i.TransactionId == id);
这将Datagridview绑定到正确的Transaction,但不允许用户添加任何新的记录。
我如何确保datagridview只显示与所需事务相关的记录,同时仍然允许用户添加/编辑记录?
编辑
我创建了一个带有文本框、按钮和datagridview的测试表单,用于测试,并具有相同的结果。Datagridview有一个正在编辑的数据库表的数据源。
public partial class frmTest : Form
{
private BindingSource bs = new BindingSource();
private UniformDataContainer db = new UniformDataContainer();
public frmTest()
{
InitializeComponent();
dataGridView1.DataSource = bs;
}
private void button1_Click(object sender, EventArgs e)
{
int id = Convert.ToInt32(textBox1.Text.ToString());
db.Items.Where(i => i.TransactionId == id).Load();
bs.DataSource = db.Items.Local.ToBindingList();
bs.ResetBindings(false);
}
private void dataGridView1_RowValidated(object sender, DataGridViewCellEventArgs e)
{
db.SaveChanges();
}
}
在调试代码时,我发现db.Items.Local
仍然包含旧的行,并且似乎不清除。
在更改后不将DataSource
重新绑定到DataGridView
,而是调用ResetBindings
方法,该方法应该用新值重置网格。
cboTransaction_SelectionChangeCommitted(object sender, EventArgs e)
{
int id = Convert.ToInt32(cboTransaction.SelectedValue);
db.Items.Where(i => i.TransactionId == id).Load();
bs.DataSource = db.Items.Local.ToBindingList();
bs.ResetBindings(false);
}
尝试一下,看看是否解决了你的问题,如果没有,我还有一个建议,但这应该做的工作:)
编辑
好的,在你编辑之后,我看到问题了。首先,您必须清除DB
类的本地缓存或绑定到where子句:
cboTransaction_SelectionChangeCommitted(object sender, EventArgs e)
{
int id = Convert.ToInt32(cboTransaction.SelectedValue);
var bindinglist = new BindingList(db.Items.Where(i => i.TransactionId == id).ToList());
bs.DataSource = bindinglist;
bs.ResetBindings(false);
}
必须先将grid的DataSource设置为null。像这样:
cboTransaction_SelectionChangeCommitted(object sender, EventArgs e)
{
int id = Convert.ToInt32(cboTransaction.SelectedValue);
db.Items.Where(i => i.TransactionId == id).Load();
bs.DataSource = db.Items.Local.ToBindingList();
dgv.DataSource = null;
dgv.DataSource = bs;
}
我设法通过处理我的数据库上下文来修复它/破解它,并重新连接:
db.Dispose();
db = new UniformDataContainer();
int id = Convert.ToInt32(textBox1.Text);
db.Items.Where(i => i.TransactionId == id).Load();
bs.DataSource = db.Items.Local.ToBindingList();
保存先前事务的现有记录,并在选择新事务后清除数据网格。
感谢@gzaxx和@SerkanOzvatan的回复!