我们正在为我们的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应用程序共享代码不会有任何巨大的,彻底的变化。
答案 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进行过滤,对其进行了更改,一切正常。
感谢您的回复,对不起,我没有提供足够的信息。