我正在使用System.DataTable
传递视图,然后呈现html table
。列的可见性因login
而异。
(即)考虑有5列colA
,colB
,colC
,colD
,colE
,这些列的可见性因每次登录而异。有些登录信息只有colA
,有些登录信息只有colA
和colD
,有些只有。{/ p>
以下是适用于上述要求的实施方法
sql procedure
将返回所有这些列,并为每列添加bit
字段列,以在此视图中显示/隐藏该列。
colA
,isColA
,colB
,isColB
等等
过滤实际上在 controller
DataTable dt = "Method here that will generate datatable";
var cols = new string[] { "colA", "isColA", "colB", "isColB", "colC", "isColC" and so on };
var colsRemove = new List<string> { };
for(int i=0; i < cols.Length; i +=2)
{
colsRemove.Add(dt.Columns[cols[i + 1]].ToString());
if(!dt.Rows[0][cols[i + 1]].Equals(true))
{
colsRemove.Add(dt.Columns[cols[i]].ToString());
colsRemove.Add(dt.Columns[cols[i + 1]].ToString());
}
}
var newDt = new DataTable();
newDt = dt.Clone();
foreach(var item in colsRemove)
{
newDt.Columns.Remove(item);
}
foreach (DataRow row in dt.Rows)
{
newDt.ImportRow(row);
}
这很好用,这是我的实际问题,
答案 0 :(得分:1)
我不知道这是否是标准做法,但我会使用DynamicObject。 以下是博客文章,为您提供有关DynamicObect的一些想法,值得一读的还有ExpandoObject。 http://blogs.msdn.com/b/csharpfaq/archive/2009/10/19/dynamic-in-c-4-0-creating-wrappers-with-dynamicobject.aspx
这是一个LinqPad代码段
void Main()
{
List<dynamic> flexibleList = new List<dynamic>();
dynamic aa = new FlexibleTable();
aa.ColumnA = "testA";
aa.ColumnB="testB";
flexibleList.Add(aa);
aa = new FlexibleTable();
aa.ColumnA = "testA1";
aa.ColumnB="testB1";
flexibleList.Add(aa);
foreach(dynamic item in flexibleList){
foreach(var columnName in item.VisibleColumns){
new object[]{item[columnName]}.Dump();
}
}
}
// Define other methods and classes here
public class FlexibleTable: DynamicObject{
private Dictionary<string,object> Columns{get; set;}
public FlexibleTable(){
this.Columns = new Dictionary<string,object>();
}
public override bool TryGetMember(GetMemberBinder binder, out object result){
if(Columns.ContainsKey(binder.Name)){
result = Columns[binder.Name];
return true;
}else{
result = null;
return false;
}
}
public override bool TrySetMember(SetMemberBinder binder, object value){
Columns[binder.Name] = value;
return true;
}
public override bool TryGetIndex(
GetIndexBinder binder, object[] indexes, out object result)
{
string index = (string)indexes[0];
return Columns.TryGetValue(index , out result);
}
public IEnumerable<string> VisibleColumns{
get{ return Columns.Select(x=>x.Key);}
}
}