Pergunta

Eu estou tentando encontrar uma linha e, em seguida, excluir essa linha a partir de uma tabela de dados. Recebo nIndex = -1. Alguém tem sugestões?

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

Solução

Uma vez que você cria um novo DataRow

dr = dt.NewRow();

Você não vai encontrá-lo na DataTable.

Você deseja remover a linha que está no DataTable:

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

não

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

Editar: Ou talvez não. Você provavelmente vai ter que percorrer todo o DataTable e comparar o valor na coluna:

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

Outras dicas

Para localizar e excluir uma linha em uma DataTable ADO.NET dado o seu ID:

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

Note que há uma diferença entre Delete e Remove. Delete muda de estado da fila para RowState.Deleted, o que torna desaparecer da DataTable para a maioria dos propósitos. Mas ainda existe. Isto é importante se você estiver usando um adaptador de dados para sincronizar o DataTable-se com uma tabela de banco de dados subjacente:. O adaptador irá excluir a linha subjacente quando você chama seu método Update e só então remover a linha da coleção Rows

Se você não estiver usando um adaptador de dados, que é OK para uso Remove para remover uma linha.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top