DataTable Rows.IndexOf ()
-
18-09-2019 - |
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);
}
}
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.