Строки с данными.indexOf()
-
18-09-2019 - |
Вопрос
Я пытаюсь найти строку, а затем удалить эту строку из 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
чтобы удалить строку.