过滤DataTable中的列?

时间:2013-02-05 05:03:16

标签: c# asp.net-mvc-4

我正在使用System.DataTable传递视图,然后呈现html table。列的可见性因login而异。

(即)考虑有5列colAcolBcolCcolDcolE,这些列的可见性因每次登录而异。有些登录信息只有colA,有些登录信息只有colAcolD,有些只有。{/ p>

以下是适用于上述要求的实施方法

sql procedure将返回所有这些列,并为每列添加bit字段列,以在此视图中显示/隐藏该列。

colAisColAcolBisColB等等

过滤实际上在 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. 还有其他最简单的方法可以达到这个要求吗?

1 个答案:

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

}