2017-02-21 7 views
1

Следующий код отлично работает, чтобы установить фильтр в таблице на основе значения в другом (чтобы прокрутить в один DataGridView, еще один отображает правильные данные):C# 2 DataGridViews, один устанавливает фильтр на другой (это работает отлично), но Delete в «master», вызывающем havoc

private void dgvCompany_SelectionChanged(object sender, EventArgs e) 
{ 
    if (dgvCompany.CurrentCell != null) 
    { 
      DataView dv = new DataView(); 
      dv.Table = htctDataSet.co_lang; 
      int irow = dgvCompany.CurrentCell.RowIndex; 
      DataRow daRow = htctDataSet.company.Rows[irow]; // use this to get value used in filter below: 
      string s = daRow.Field<int>("company_id").ToString(); // this throw exception after doing a delete 
      dv.RowFilter = "company_id = " + s; //edited to show above line is problem 
      dgvLang.DataSource = dv; 
    } 
} 

Но когда я удалить строку в компании (таблицу в приведенном выше используются для установки фильтра в другой таблице), то dv.RowFilter линия генерирует: необработанного исключение типа

'System.Data.DeletedRowInaccessibleException'

Функция удаления код:

int irowCo = dgvCompany.CurrentCell.RowIndex; 
DataTable dtCo = this.htctDataSet.company; 
dtCo.Rows[irowCo].Delete(); 
//dtCo.AcceptChanges(); 

Если я раскомментировать выше линии, то никакие исключения не выбрасываются, НО, то я не могу сохранить в базе данных

Сохранить код (не показывать сделки) :

this.companyBindingSource.EndEdit(); 
this.companyTableAdapter.Update(this.htctDataSet.company); 

Мой вопрос Как я ловушку выше исключение или как я работаю вокруг AcceptChanges(), так что I C затем сохранить в базу данных?

+0

Могли бы вы не установить фильтр или DataSource второй DataGridView, чтобы ни один/нуль, прежде чем удалить? Затем перетащите его после удаления? – JohnG

+0

Я отредактировал источник, чтобы показать, что проблема связана с первой/главной таблицей. Извините за путаницу. – user1119520

ответ

1

Сделайте копию DataTable, чтобы избежать связи между двумя способами.

  dv.Table = htctDataSet.co_lang.Copy(); 

private void dgvCompany_SelectionChanged(object sender, EventArgs e) 
{ 
    if (dgvCompany.CurrentCell != null) 
    { 
      DataView dv = new DataView(); 
      dv.Table = htctDataSet.co_lang.Copy(); 
      int irow = dgvCompany.CurrentCell.RowIndex; 
      DataRow daRow = htctDataSet.company.Rows[irow]; // use this to get value used in filter below: 
      dv.RowFilter = "company_id = " + daRow.Field<int>("company_id").ToString(); // this throw exception after doing a delete 
      dgvLang.DataSource = dv; 
    } 
} 
+0

Я отредактировал источник, чтобы показать, что проблема связана с первой/главной таблицей. Извините за путаницу. Я попробую Копировать на первой/главной таблице и посмотрю, что произойдет. Спасибо за ввод. – user1119520

+0

Ваше предложение задал мне верный путь, спасибо! Вот что я сделал для других, у кого есть эта проблема - я создал копию таблицы: DataTable dtCo = new DataTable(); // мастер-таблица dtCo = htctDataSet.company.Copy(); // ключ был Копировать! Спасибо! DataRow daRow = dtCo.Rows [irow]; string s = daRow.Field ("company_id"). ToString(); // Теперь это работает! – user1119520