问候每个人 -
在下面的代码中,如果电子邮件地址不匹配,我会尝试将现有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
}
}
}
}
答案 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);