2013-06-13 4 views
0

У меня есть форма с комбинированным полем и элементом управления 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 все еще содержит старые строки, и, похоже, не ясно.

ответ

0

мне удалось это исправить/взломать вокруг него, избавляясь от моей базы данных 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 за ваши ответы!

1

Вместо того, чтобы поменять 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 класса или связываются с вашим, где положение:

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); 
} 
+0

Не повезло, я боюсь. Я создал отдельную форму для тестирования (см. Отредактированный вопрос выше), но в datagridview все еще отображаются предыдущие записи. Я также заметил, что db.Items.Local все еще хранит предыдущие записи базы данных. –

+0

см. Мое редактирование, надеюсь, это сработает для вас :) – gzaxx

+0

Ваш текст очищает datagridview, однако он не добавляет новые записи в базу данных. Я обманул и подумал, что у меня это есть, используя 'db.Items.Local.Clear()', но он сохранит только последние добавленные записи. –

0

Вы должны установить DataSource GRID на 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; 
} 
+0

Это не удаляет предыдущие записи при изменении 'id'. –

Смежные вопросы