0

行を見つけて、その行をデータテーブルから削除しようとしています。nIndex = -1 を取得し続けます。誰にも提案がありますか?

protected void cbxSelected_CheckedChanged(object sender, EventArgs e)
{
 CheckBox checkbox = (CheckBox)sender;
 GridViewRow row = (GridViewRow)checkbox.NamingContainer;
 string sSampleId = row.Cells[1].Text;

 if (!string.IsNullOrEmpty(sSampleId))
 {
  DataTable dt;

  if (ViewState["dtTemp"] != null)
  {
   dt = (DataTable)ViewState["dtTemp"];
  }
  else
  {
   dt = new DataTable();
   dt.Columns.Add("sample_id");
  }

  DataRow dr;
  string[] drow = new string[] { sSampleId };
  dr = dt.NewRow();
  dr.ItemArray = drow;

  if (checkbox.Checked == true)
  {
   dt.Rows.Add(dr);
  }
  else if (checkbox.Checked == false)
  {
   int nIndex = dt.Rows.IndexOf(dr);
   dt.Rows.RemoveAt(nIndex);
  }

  ViewState.Add("dtTemp", dt);
 }
}
4

2 に答える 2

0

新しいDataRowを作成するので

dr = dt.NewRow();

DataTable にはありません。

DataTable にある行を削除します。

int nIndex = dt.Rows.IndexOf(row);

いいえ

int nIndex = dt.Rows.IndexOf(dr);

編集: そうでないかもしれません。おそらく、DataTable 全体をループして、列の値を比較する必要があります。

for (var i = dt.Rows.Count; i >= 0; i--)
  if (dt.Rows[i].Cells[1].Text == sSampleId) {
    dt.Rows.Remove(i);
    break;
  }
}
于 2009-09-29T15:03:51.660 に答える
0

DataTableID を指定して ADO.NET 内の行を検索して削除するには、次のようにします。

DataRow[] found = dt.Select("sample_id = " + sample_id);
if (found.Length < 0)
{
   found[0].Delete();
}

Deleteと の間には違いがあることに注意してくださいRemoveDelete行の状態を に変更します。これにより、ほとんどの目的で行RowState.Deletedが から消えます。DataTableしかし、それはまだ存在します。これは、データ アダプターを使用して基になるデータベース テーブルと同期する場合に重要です。アダプターは、そのメソッドDataTableを呼び出したときに基になる行を削除し、その行をコレクションから削除します。UpdateRows

データ アダプターを使用していない場合は、使用Removeして行を削除しても問題ありません。

于 2009-09-29T15:45:12.470 に答える