从数据表中删除行给出错误表没有主键 [英] Remove row from datatable gives error table does not have primary key

查看:209
本文介绍了从数据表中删除行给出错误表没有主键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个数据表,当我从中删除行时,它会抛出一个表没有主键的错误。

任何人都有解决方案吗?



i想要从数据表中删除选定的组合项目。



我尝试过的方法:



I have a datatable, when i remove row from it, it will throws an error that table does not have primary key.
any one have solution for it?

i want to remove selected item of combobox from the datatable.

What I have tried:

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);
                    }
                }
            }
        }

推荐答案





下面是删除行的代码。



Hi,

Below, code to delete rows.

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; 
            }
        }


用下面的循环替换你的foreach循环来识别特定的行然后删除它应该可以解决问题。



for(int i = dt.Rows.Count-1; i> = 0; i--)

{

DataRow dr = dt.Rows [i];

if(dr [Data] ==((ComboBox)sender).Text)

dr.Delete();

}
Replacing your foreach loop with the below loop to identify the specific row and then delete it should do the trick.

for(int i = dt.Rows.Count-1; i >= 0; i--)
{
DataRow dr = dt.Rows[i];
if (dr["Data"] == ((ComboBox)sender).Text)
dr.Delete();
}


通过主键识别和比较行。你问的是这组行是否包含一行主键选择



另外,你永远不应该在迭代中对迭代器进行更改。这也会引发错误。



试试这个:



The rows are identified and compared via a primary key. You're asking if the set of rows contains a row with the primary key selected.

Also, you should never make changes to an iterator within the iteration. This will throw an error also.

Try this instead:

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; 删除行后,但这很干净



Another way would be to add a Break; after you remove the row, but this is pretty clean


这篇关于从数据表中删除行给出错误表没有主键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆