2011-08-02 31 views
0

DataGridViewから複数の選択された行を削除しようとしています。以下のコードを試してみると、選択された行のうちのほんの一部が削除されます。たとえば、7つの行があり、5つの連続する行を選択してdeleteを押すと、3つだけが削除されます。DataGridViewで複数の行を削除する方法

IEnumerable<DataGridViewRow> dgvrs = from dgvrws in dgvChemicalInv.Rows.Cast<DataGridViewRow>() 
               where dgvrws.Selected.Equals(true) 
               select dgvrws; 

      foreach (DataGridViewRow dgr in dgvrs) 
      { 
       dctchemri = dgr.Cells["DCT_CHEMRI"].Value.ToString(); 
       index = dgvChemicalInv.CurrentRow.Index; 

       var chemObj = (from chmObj in DCTProjectNodeObj.Chemicals 
           where chmObj.DCTChemRI.Equals(dctchemri) 
           select chmObj).Single(); 

       if (sqlCmd.Delete_Chems(this.projID, (csDCTChemicalObj)chemObj)) 
       { 
        dgvChemicalInv.Rows.Remove(dgr); 
       } 
       if (dgvChemicalInv.RowCount > 0) 
       { 
        DCTProjectNodeObj.Chemicals.Remove((csDCTChemicalObj)chemObj); 
       } 
       else 
       { 
        DCTProjectNodeObj.Chemicals = new List<csDCTChemicalObj>(); 
        DO_BtnSaveClickEvent(); 
       } 
      } 

はありがとう、

ビル・O.

答えて

0

あなたのコードは読みにくいですが、あなたはこれをあまりにも複雑にしていると思います。私はBindingSourceオブジェクトのようなものを使用することをお勧めします。これにより、テーブル管理がずっと簡単になります。 BindingSourcedatasourceをテーブルに、datasourceDataGridViewBindingSourceオブジェクトに設定します。テーブルに加えた変更は、SubmitChanges()にコールした後にDataContextに反映されます。

例:

MyDataContext dataContext = new MyDataContext(); 
BindingSource bindingSource = new BindingSource(); 

bindingSource.DataSource = dataContext.MyTable; 
dataContext.DataSource = bindingSource; 

私がこれをやったので、しばらくしているが、私は、これはそれを行うための最も簡単な方法だと思います。これにより、混乱した操作は回避されますが、外部キーの関係では複雑になる可能性があります。

物事を簡単にする方法です。

+0

私はこの可能性を検討していますが、SqlCEデータベースでは動作しません。 –

+0

あなたがSqlCEを使っていたことを知りませんでした。それほど多くの経験はありませんが、SqlCEでは正確には動作しません。 – krs1

+0

dataContextクラスの接続と設定。私はこのブログ[リンク](http://blogs.msdn.com/b/charlie/archive/2007/12/10/understanding-the-datacontext.aspx)に従っていた –

2

あなたのコードが読みするのは非常に難しいです。とにかく問題がforeachにあると確信しています。通常、ループしているコレクションからforeachループ内のアイテムを削除することはできません。 とにかく、最良の選択は、データソースから項目を削除すること(リピーターからIDを取得すること)とデータをリピートすることです。

+0

私は、選択されているすべての行のデータグリッドビューに対してLinqクエリを実行しており、foreachループでそれらを削除しようとしています。デバッグでは、ステップバイステップで、列挙型dgvrsの結果ビューでインデックスが変化するのを見ることができ、これらのインデックスは、行が削除されるときに行インデックスに対応します。私はそれを今歩いているので、私は最後の行を除くすべてを削除することができます。 –

+0

ここでは、コード 'code'のさまざまな基礎を示します。IEnumerable dgvrs = dgvChemicalInv.Rows.Cast ()内のdgvrws dgvrws.Selected.Equals(true) select dgvrws; foreachの(dgvrsでDataGridViewRow DGR) {dgvChemicalInv.Rows.Remove(DGR)。 } –

0

私は@Massimiliano Pelusoに同意します。一般的には、すべてのIDを1回で取得し、行ごとに1つ呼び出すのではなく、削除するIDのカンマ区切りリストを渡すだけで1つのデータベース呼び出しを行います。あなたは一度それを呼び出すことができるとDB 200回を呼び出すと完了する必要はないようです。私はデータを再バインドし、それを使って完了します。

関連する問題