0

我有一个带有组合框和 datagridview 控件的表单。组合框由数据库表填充,并存储事务 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;
}

对于第一个记录,这很好用。用户可以毫无问题地在 DataGridView 中选择事务 ID 并添加/编辑项目记录。

但是,当用户从组合框中选择不同的事务时,事情会变得有点混乱。使用上面的代码,DataGridView 不会清除具有旧 ID 号的行,而是显示旧记录 + 新选择的 Transaction 的任何记录。我假设 Where() 子句会将 DataGridView 限制为事务 ID 匹配的那些项目。

如果我将db.SaveChanges();和 添加dgv.Rows.Clear();到该块的开头,则成功清除行,但是更改不会保存到数据库中。

我也试过

db.Items.Load();
bs.DataSource = db.Items.Local.ToBindingList().Where(i => i.TransactionId == id);

这会将 Datagridview 绑定到正确的事务,但不允许用户添加任何记录。

如何确保 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仍然包含旧行,并且似乎没有清除。

4

3 回答 3

1

而不是重新绑定DataSourceDataGridView更改后,调用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);
}
于 2013-06-13T07:05:09.473 回答
0

我设法通过处理我的 Database Conext 并重新连接来修复它/破解它:

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 的回复!

于 2013-06-14T01:29:11.740 回答
0

您必须在设置之前将网格的 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;
}
于 2013-06-13T08:02:24.603 回答