2013-02-05 103 views
1

我傳遞與System.DataTable,並從該html table呈現一個視圖。列的可見性因login而異。過濾DataTable中的列?

(即)考慮有5列作爲colAcolBcolCcolDcolE和這些列可視性每個登錄而變化。有些登錄只有colA,部分colAcolD有的都。

下面是對上述需求量的

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. 有沒有達到這個要求,任何其他簡單的方法?
+0

標準的做法是修改用於生成DataTable中的SQL,以便只有所需的列都包含在查詢中。你的方法可以工作,但效率不高,因爲每個登錄都會返回所有列,無論它們是否被使用。但是,你已經在效率低下的一個世界,因爲你使用的是數據表生成HTML(這不會是一個高容量的網站一個很好的設計)。 – MusiGenesis

回答

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

} 
+0

+1讓我知道'DynamicObject' – DON