nirmalVaishnav Ответов: 4

Удалить строку из datatable дает ошибку таблица не имеет первичного ключа


У меня есть datatable, когда я удаляю из него строку, она выдает ошибку, что таблица не имеет первичного ключа.
у кого-нибудь есть решение для этого?

я хочу удалить выбранный элемент combobox из datatable.

Что я уже пробовал:

private void dropDownDemo_Load(object sender, EventArgs e)
       {

           dt.Columns.Add("Data");
           dt.Rows.Add("None");
           dt.Rows.Add("1st");
           dt.Rows.Add("2nd");
           dt.Rows.Add("3rd");
       }


public void removeSelected(string selected)
        {
            if (selected != "None")
            {
                foreach (DataRow row in dt.Rows)
                {
                    if (dt.Rows.Contains(selected))    //throw error here :- System.Data.MissingPrimaryKeyException: Table doesn't have a primary key.
                    {
                        dt.Rows.Remove(row);
                    }
                }
            }
        }

4 Ответов

Рейтинг:
30

Sheila Pontes

Привет,

Ниже приведен код для удаления строк.

public void removeSelected(string selected)
        {
            try
            {
                if (selected != "None")
                {
                    DataRow[] drs = dt.Select("Data = '" + selected + "'");

                    if (drs.Length > 0)
                    {
                        foreach (DataRow dr in drs)
                        {
                            dr.Delete();
                            dt.AcceptChanges();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                this.lblError.Text = ex.Message; 
            }
        }


Рейтинг:
1

Atlapure Ambrish

Замена цикла foreach на цикл ниже, чтобы идентифицировать конкретную строку, а затем удалить ее, должна сделать свое дело.

для(тип int я = ДТ.Строк.Count-1; i >= 0; i--)
{
Доктор строкаданных = ДТ.Строки[я];
если (д-р["данные"] == ((комбобокс)отправителя).Текст)
др.Удалить();
}


Рейтинг:
1

CHill60

Ни одно из других решений, похоже, не обратило внимания на тот факт, что вы не добавили первичный ключ в свой datatable...Contains не будет работать без первичного ключа (ссылка DataColumnCollection.Содержит Метод (String) (System. Data)[^] )

private void dropDownDemo_Load(object sender, EventArgs e)
{
 
            dt.Columns.Add("Data");
            dt.Rows.Add("None");
            dt.Rows.Add("1st");
            dt.Rows.Add("2nd");
            dt.Rows.Add("3rd");

            dt.PrimaryKey = new DataColumn[] { dt.Columns["Data"] };
}


Затем вы можете использовать Contains (NB untested)

public void removeSelected(string selected)
{
    if (selected != "None")
    {
        while (dt.Rows.Contains(selected))
        {
            DataRow foundRow = table.Rows.Find(selected);
            if(foundRow != null)
            {
                dt.Rows.Remove(foundrow);
            }
        }
    }
}


Рейтинг:
0

Andy Lanng

Строки идентифицируются и сравниваются с помощью первичного ключа. Вы спрашиваете, содержит ли набор строк строку с первичным ключом selected.

Кроме того, вы никогда не должны вносить изменения в итератор внутри итерации. Это также вызовет ошибку.

Попробуйте вместо этого:

private void dropDownDemo_Load(object sender, EventArgs e)
        {
 
            dt.Columns.Add("Data");
            dt.Rows.Add("None");
            dt.Rows.Add("1st");
            dt.Rows.Add("2nd");
            dt.Rows.Add("3rd");
        }
public void removeSelected(string selected)
        {
            var dtTemp = new DataTable;
            dtTemp .Columns.Add("Data");
            if (selected != "None")
            {
                foreach (DataRow row in dt.Rows)
                {
                    if (!dt.Rows["Data"].Contains(selected))   
                    {
                        dtTemp.Rows.Add(row)
                    }
                }
            }
            dt = dtTemp;
        }


Другим способом было бы добавить Break; после того, как вы удалите строку, но это довольно чисто