C# 如何防止数据行单元格值被重置?

C# 如何防止数据行单元格值被重置?,c#,ado.net,C#,Ado.net,我们正在为我们的web应用程序创建一个演示模式。我们将通过创建与真实客户机绑定的新用户来实现这一点,显示他们的所有数据,但将某些字段过滤为不可识别的名称、重要数字等 奇怪的是,在我调用第一个函数的标准show one页面中,数据被正确过滤。当我尝试调用列表页上的第二个时,过滤器不起作用。我已经详细介绍了这些函数,在第一个函数中,似乎设置了值,但是当foreach迭代到下一行时,这些值被重置回原始值 列表掩码是应屏蔽的列名列表,在模型中静态定义 public static void ApplyDe

我们正在为我们的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);
}
我很感激能提供的任何帮助。由于某种原因,我在系统数据方面有点笨

编辑:如果有帮助,当我的调试器在第二个函数中的}上着陆时,行[ClientName]是应该的演示客户端,但response.resultable.Rows[0][ClientName]是原始客户端。奇怪

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

尝试添加对

Row.AcceptChanges()
在applydemask中的ForEach语句之后

看起来您的datagrid绑定到的是行的当前版本,而不是建议的版本。下面是一些关于datatable中datarows的rowstate的参考


可能您多次删除和添加了相同的记录。因此,您正在更新已删除的。将第二种方法更改为:

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);
    }
}
希望这有帮助。

我是个心不在焉的白痴

检查可结果表的定义

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,对其进行了更改,一切正常


感谢您的回复,很抱歉我没有提供足够的信息。

是否将数据集绑定到控件。如果是,请删除绑定并填充控制程序。这将是一个比这更大的更改。理想情况下,我只想修改我的数据并处理它,但我将尝试这样做作为最后的手段。您看到两个版本的数据的原因是datarow实际上具有事务性,可以在提交更改之前回滚更改,并在任何时候跟踪该行的多个版本。当您在列表页上进行数据绑定时,请使用datagrid,不要指定列名—随它去吧动态生成。您的代码可能在第一个函数中添加了额外的列。另一种方法:尝试使用类型化数据集。不需要。今天早些时候,我尝试将调用添加到第一个函数的末尾,还尝试了Resultable.AcceptChanges。@Stuart:什么是FindResponse类型?这是从datatable继承的吗?@Stuart-oops,我明白了。它包含一个成员数据表。我相信上面的评论下意识地指引了我正确的方向。谢谢