Вопрос

Я пытаюсь найти строку, а затем удалить эту строку из datatable .Я продолжаю получать 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);
 }
}
Это было полезно?

Решение

Поскольку вы создаете новый поток данных

dr = dt.NewRow();

вы не найдете его в таблице данных.

Вы хотите удалить строку, которая НАХОДИТСЯ в DataTable:

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

не

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

Редактировать: А может, и нет.Вероятно, вам придется перебрать всю таблицу данных и сравнить значение в столбце:

for (var i = dt.Rows.Count; i >= 0; i--)
  if (dt.Rows[i].Cells[1].Text == sSampleId) {
    dt.Rows.Remove(i);
    break;
  }
}

Другие советы

Чтобы найти и удалить строку в ADO.NET DataTable учитывая его идентификатор:

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

Обратите внимание, что есть разница между Delete и Remove. Delete изменяет состояние строки на RowState.Deleted, что заставляет его исчезнуть из DataTable для большинства целей.Но она все еще существует.Это важно, если вы используете адаптер данных для синхронизации DataTable вместе с базовой таблицей базы данных:адаптер удалит базовую строку, когда вы вызовете его Update метод и только после этого удалите строку из Rows Коллекция.

Если вы не используете адаптер данных, его можно использовать Remove чтобы удалить строку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top