【发布时间】:2010-11-19 09:08:33
【问题描述】:
我有以下代码,在每个Form 上重复,作为更新过程的一部分。当页面加载时,BLL 返回一个DataSet,比如
_personInfo = ConnectBLL.BLL.Person.GetPerson(personID);
我将DataSet 存储在Form 级别变量中,然后我用它来检查验证/更新过程中的更改。我一次将一行(尽管永远不会超过一行)传递给Function,它获取控件中的值并将其与DataSet 中的相应列值进行比较。如果发现不同,则将该列 = 设置为新值,并将名称添加到更改内容的 List。
// Load Person info
using (var tmpPersonDT = tmpPersonDS.Tables[0])
{
if (tmpPersonDT.Rows.Count > 0)
{
foreach (DataRow row in tmpPersonDT.Rows)
{
CheckPersonData(row);
}
}
}
// Snippet of the CheckPersonData() that is being called....
if (!object.Equals(row["ResidencyCountyID"], lkuResidenceCounty.EditValue))
{
row["ResidencyCountyID"] = lkuResidenceCounty.EditValue;
_whatChanged.Add("ResidencyCounty");
}
if (!object.Equals(row["ResponsibilityCountyID"], lkuResponsibleCounty.EditValue))
{
row["ResponsibilityCountyID"] = lkuResponsibleCounty.EditValue;
_whatChanged.Add("ResponsibilityCounty");
}
if (!object.Equals(row["HispanicOriginFlag"], chkHispanic.EditValue))
{
row["HispanicOriginFlag"] = chkHispanic.EditValue;
_whatChanged.Add("HispanicOriginFlag");
}
if (!object.Equals(row["CitizenFlag"], chkCitizen.EditValue))
{
row["CitizenFlag"] = chkCitizen.EditValue;
_whatChanged.Add("CitizenFlag");
}
if (!object.Equals(row["VeteranFlag"], chkVeteran.EditValue))
{
row["VeteranFlag"] = chkVeteran.EditValue;
_whatChanged.Add("VeteranFlag");
}
我想要回答的是,这真的是解决这个问题的最有效方法吗?
如果没有别的,我想创建一个函数来进行比较,而不是重复 30 次(每种形式不同),但我无法完全弄清楚。我想也许我可以使用 row[].ItemArray 但那只有值。我必须提前知道这些物品的顺序并保证它们不会改变......
在 CRUD 应用程序中使用 DataSets/DataTables 时我是否遗漏了一些明显的东西?
juliandewitt's post below is fantastic!
我只是,现在,需要一些关于如何在上面使用它的指导。任何人都可以指出我的任何链接将不胜感激。如果你能发布一个例子就更好了。
这样使用 DataRows 有什么缺点吗?
【问题讨论】:
-
whew 我认为这是我有史以来最大的答案 :) 说真的,我希望在内置状态跟踪、强类型 DataSet 和 TableAdapter 以及我们拥有的 DataBinding 之间为您打开了一些大门,让您可以在 Visual Studio 中找到一些 RAD 工具以及 ADO.NET 的强大功能。也就是说,它不是灵丹妙药,也不是完美的系统。这是一个具有缺陷和局限性的广泛系统,但它是 .NET 1.0 - 2.0 的基石。然而,.NET 3.0 及更高版本开始远离 ADO.NET,并且在 3.5 SP1 中实体框架开始显现。不过,这一切仍然值得了解!
标签: c# .net winforms refactoring dataset