У меня есть форма с комбинированным полем и элементом управления datagridview. Поле со списком заполняется таблицей базы данных и сохраняет идентификатор транзакции.Обновление DataGridView на основе значения Combobox
Когда поле со списком обновлено, Datagridview привязан к таблице базы данных и отображает записи, связанные с идентификатором транзакции, из поля со списком.
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 без проблем.
Однако, когда пользователь выбирает другую транзакцию Сделка из поля со списком, все становится немного грязнее. Используя приведенный выше код, DataGridView не очищает строки со старым идентификационным номером, но показывает старые записи + любые записи для недавно выбранной транзакции. Я предположил, что предложение Where() ограничивает DataGridView теми элементами, в которых сопоставляется идентификатор транзакции.
Если я добавлю db.SaveChanges();
и dgv.Rows.Clear();
в начало этого блока, строки будут удалены успешно, однако изменения не будут сохранены в базе данных.
Я также попытался
db.Items.Load();
bs.DataSource = db.Items.Local.ToBindingList().Where(i => i.TransactionId == id);
Это связывает DataGridView к правильной сделки, но не позволяет пользователю добавлять новые записи.
Как я могу гарантировать, что в datagridview отображаются только записи, связанные с требуемой транзакцией, при этом позволяя пользователю добавлять/редактировать записи?
EDIT
Я создал тестовую форму с текстовым полем, кнопкой и 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
все еще содержит старые строки, и, похоже, не ясно.
Не повезло, я боюсь. Я создал отдельную форму для тестирования (см. Отредактированный вопрос выше), но в datagridview все еще отображаются предыдущие записи. Я также заметил, что db.Items.Local все еще хранит предыдущие записи базы данных. –
см. Мое редактирование, надеюсь, это сработает для вас :) – gzaxx
Ваш текст очищает datagridview, однако он не добавляет новые записи в базу данных. Я обманул и подумал, что у меня это есть, используя 'db.Items.Local.Clear()', но он сохранит только последние добавленные записи. –