1

レンダリングされたビューSystem.DataTableとそこからビューを渡します。html table列の可視性は、それぞれによって異なりますlogin

(つまり、、、、、として5つの列があり、これらcolAの列の可視性はログインごとに異なると考えてください。一部のログインにはのみがあり、一部にはあり、一部にはすべてがあります。colBcolCcolDcolEcolAcolAcolD

上記の要件に対して正常に機能する実装は次のとおりです

sql procedurebitこのようなビューでその列を表示/非表示にするために、各列のフィールド列とともにこれらすべての列を返します。

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 に答える