在DataTable问题中添加一行

时间:2010-11-16 16:49:07

标签: c#

问候每个人 -

在下面的代码中,如果电子邮件地址不匹配,我会尝试将现有DataTable(dtResult)中的一行添加到新的DataTable(dtCopyResult)中。所以我想我对ADO.NET的了解不尽如人意,因为无论何时我尝试运行下面的代码,我都会得到一个“This Row已经属于另一个表”。请告诉我如何解决这个问题..

非常感谢

 if (checkBox1.Checked)  
                    {

                        for (int i = dtResult.Rows.Count - 1; i >= 0; i--)  //dtResult is a DataTable
                        {
                            foreach (object email in emails)  //emails is an ArrayList of email addresses
                            {
                                if (email.ToString().ToUpper() != dtResult.Rows[i][3].ToString().ToUpper())
                                {
                                    dtCopyResult.Rows.Add(dtResult.Rows[i]);  //dtCopyResult is a new blank DataTable that I'm trying to add rows to
                                }
                            }

                        }

                    }

5 个答案:

答案 0 :(得分:6)

正如错误消息告诉您的那样,DataRow属于特定的DataTable;你不能把它拿走并添加到另一个。你可以做的是

  • 创建 new DataRow并使用旧DataRow或

  • 中的值填充它
  • 使用DataTable.ImportRow方法:

    dtCopyResult.ImportRow(dtResult.Rows[i]);
    

答案 1 :(得分:1)

您可以使用ImportRow功能,完整示例http://support.microsoft.com/kb/308909

答案 2 :(得分:1)

我注意到的一件事是新行会多次添加;一次为电子邮件集合中的每个项目。 您需要保留已添加的本地项目列表,或循环访问dtCopyResult以确保您尚未添加该电子邮件。

List<string> alreadyAdded = new List<string>();

if (email.ToString().ToUpper() != dtResult.Rows[i][0].ToString().ToUpper() 
    && !alreadyAdded.Contains(email.ToString()))
{
    dtCopyResult.ImportRow(_dt1.Rows[i]);
    alreadyAdded.Add(email.ToString());
}

答案 3 :(得分:0)

表示添加行属于“dtResult”,DataRow是表示数据的“对象”。不是数据本身。所以在这种情况下你尝试添加属于另一个会出错的表的DataRow对象。

另一种方法是将所有内容复制到dtCopy,如果条件不匹配则将其删除。 数组主要用于存储各种类型的对象。在这种情况下,如果你只存储电子邮件,你应该使用

List<string> emails = new List<string>();
emails.Add("test@example.com");

枚举删除数据的行

List<DataRow> removing = new List<DataRow>();
foreach(var row in table.AsEnumerable()) // or table.Rows
if(...condition)removing.Add(row);

foreach(var row in removing)table.Rows.Remove(row);

使用'删除'的原因是,如果你循环遍历行并同时删除它,则意味着你改变了会导致错误的枚举。当你把它的循环拉出来时,.Net并不高兴。

答案 4 :(得分:0)

尝试替换

 dtCopyResult.Rows.Add(dtResult.Rows[i]);

DataRow rowToBeCopied = dtCopyResult.NewRow();
//Copy the row values..
rowToBeCopied.X = dtResult.Rows[i].X;
//Copy the remaining row values
dtCopyResult.Rows.Add(rowToBeCopied);