Pregunta

Estoy tratando de encontrar una fila y luego eliminar esa fila de una tabla de datos. Sigo recibiendo nIndex = -1. Alguien tiene sugerencias?

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);
 }
}
¿Fue útil?

Solución

Desde que se crea un nuevo DataRow

dr = dt.NewRow();

que no lo encontrará en el DataTable.

Se desea eliminar la fila que se encuentra en el DataTable:

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

no

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

Editar O tal vez no. Es probable que tenga que recorrer todo el DataTable y comparar el valor de la columna:

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

Otros consejos

Para encontrar y eliminar una fila en un ADO.NET DataTable dada su ID:

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

Tenga en cuenta que hay una diferencia entre Delete y Remove. Delete cambia de estado de la fila a RowState.Deleted, lo que hace desaparecer de la DataTable para la mayoría de los propósitos. Sin embargo, todavía existe. Esto es importante si usted está utilizando un adaptador de datos para sincronizar la DataTable con una tabla de base de datos subyacente:. El adaptador se elimine la fila subyacente cuando se llama a su método Update y sólo entonces se quita la fila de la colección Rows

Si usted no está usando un adaptador de datos, que está bien usar Remove para eliminar una fila.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top