如何防止重置DataRow单元格值?

时间:2009-02-11 06:11:04

标签: c# ado.net

我们正在为我们的Web应用程序创建演示模式。我们通过创建绑定到真实客户端的新用户,显示他们的所有数据,但过滤某些字段是不可识别的(名称,重要数字等等)来实现这一目标。

这里的奇怪部分是我正在调用第一个函数的标准“show one”页面正确过滤数据。当我尝试在列表页面上调用第二个时,过滤器不起作用。我已经逐步完成了这些功能,看来在第一个函数中,值正在设置,但正在重置当foreach迭代到下一行时,到原始值。

列表掩码是应该屏蔽的列名列表,并在模型中静态定义。

public static void ApplyDemoMask(DataRow row, List<string> mask)
{
    foreach (DataColumn column in row.Table.Columns)
    {
        if (mask.Contains(column.ColumnName))
        {
            if (column.ColumnName == "ClientName")
                row[column] = "Demo Client";
            // More fields follow...
        }
    }
}

public static void ApplyDemoMask(FindResponse response, List<string> mask)
{
    foreach (DataRow row in response.ResultTable.Rows)
        ApplyDemoMask(row, mask);
}

我感谢任何帮助。出于某种原因,我对System.Data有点愚蠢。

编辑:如果有帮助,当我的调试器落在第二个函数中的“}”时,行[“ClientName”]应该是“Demo Client”,但是response.ResultTable.Rows [0] [“ ClientName“]是”原始客户端“。怪异!

编辑:绑定到我的网格时,我必须指定列名。首先,我们使用ASP.NET MVC并使用我们编写的自定义控件来帮助我们从ASP.NET过渡。其次,我们有很多模板字段。使用相当大的WinForms业务线应用程序,这个Web应用程序共享代码不会有任何巨大的,彻底的变化。

3 个答案:

答案 0 :(得分:0)

尝试添加对

的调用
Row.AcceptChanges()
ForEach。{/ p>中的ApplyDemoMask语句之后

您的数据网格似乎绑定到行的当前版本,而不是提议的版本。以下是有关数据表中数据行的 rowstate 的一些参考。

答案 1 :(得分:0)

也许您删除并多次添加相同的记录。所以你要更新删除的那个。将第二种方法更改为:

public static void ApplyDemoMask(FindResponse response, List<string> mask)
{
    foreach (DataRow row in response.ResultTable.Rows)
    {
        if (row.RowState != DataRowState.Deleted)
        {
            ApplyDemoMask(row, mask);
        }
    }
}

或者那样:

public static void ApplyDemoMask(FindResponse response, List<string> mask)
{
    response.ResultTable.AcceptChanges();
    foreach (DataRow row in response.ResultTable.Rows)
    {
        ApplyDemoMask(row, mask);
    }
}

希望这会有所帮助。

答案 2 :(得分:0)

我是一个心不在焉的笨蛋!

查看ResultTable的定义......

public DataTable ResultTable { get { return this[_resultKey]; } }
public DataTable this[string tableName]
{
    get { return _data.Tables[tableName].DefaultView.ToTable(); }
}

我正在更改DataTable的DefaultView.ToTable(),这在返回再次读取ResultTable时丢失了。我完全忘记了这种行为以及我们的内部FindResponse类是如何工作的。它对我们的应用程序有意义,所以我刚刚添加了一个类似的BaseTable访问器,它不会通过DataTable.DefaultView进行过滤,对其进行了更改,一切正常。

感谢您的回复,对不起,我没有提供足够的信息。