1

我正在传递一个视图,System.DataTable并从中传递一个视图html table。列的可见性随每个login.

(即)考虑有 5 列,如colAcolBcolCcolDcolE并且这些列的可见性随每次登录而变化。有些登录只有colA,有些登录colAcolD有些拥有。

这是适用于上述要求的实现

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);
 }

这很好用,这是我的实际问题,

  1. 执行是否是标准做法?
  2. 有没有其他最简单的方法来实现这个要求?
4

1 回答 1

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);}
  }

}
于 2013-02-14T01:56:55.777 回答