2016-08-29 12 views
0

私が取り組んでいるWebプロジェクトでは、ダイナミックコントロールを使用して3つのオブジェクトリスト(EmployeeOwner、およびTradeReference)を表示する必要があります。これらの3つのクラスはクラスDataEntryを拡張します。どのようにWebコントロールをシリアル化しますか?どのように私は関数をシリアル化するのですか?

protected void DisplayEmployees() 
{ 
    for (int i = 0; i < employees.Count; i++) 
    { 
     Employee emp = employees[i]; 
     emp.DisplaySelf(i, EmployeeDisplayPanel); 

    }//end for 
}//end CreateDynamicEmployeeContols() 


protected void DisplayOwners() 
{ 
    for (int i = 0; i < owners.Count; i++) 
    { 
     Owner own = owners[i]; 
     own.DisplaySelf(i, OwnerDisplayPanel); 

    }//end for 
}//end CreateDynamicOwnerContols() 


protected void DisplayTradeRefs() 
{ 
    for (int i = 0; i < tradeRefs.Count; i++) 
    { 
     TradeReference tRef = tradeRefs[i]; 
     tRef.DisplaySelf(i, TradeRefDisplayPanel); 

    }//end for 
}//end CreateDynamicTradeRefContols() 

このソリューションは、コードの重複を持っているので、私はListを拡張ジェネリッククラスDisplayableListを作成しました:私はこのようになり、3つの別々の表示機能を持っています。 DisplayableListPanelへの参照を保持し、そのための{get}メソッドを持っています。それ以外の場合はListと同じです。今度は私のコードはこのようになります:

[Serializable] 
public class DisplayableList<T> : List<T> 
{ 
    private Panel display; 

    public DisplayableList(ref Panel display) 
    { 
     this.display = display; 

    }//end constructor 

    public Panel Display 
    { 
     get 
     { 
      return this.display; 

     }//end get 
    }//end Display 

}//end class 


//on Web Page 
{ 
... 

    protected void DisplayList(DisplayableList<DataEntry> list) 
    { 
     for (int i = 0; i < list.Count; i++) 
     { 
      DataEntry entry = list[i]; 
      entry.DisplaySelf(i, list.Display); 

     }//end for 
    }//end DisplayList()    ...ext... }//end Page 

これはうまくいくはずですが、Panelがシリアル化されていないため、実行時エラーが発生します。 Webコントロールをシリアル化するにはどうすればよいですか?それが不可能な場合は、コードの重複やカプセル化を破らないソリューション(実装パターン)を実装するにはどうすればよいですか?私は多くの問題への道であるかの時点でそれをデシリアライズする必要がありますするつもりですので、

編集

はIは、パネルをシリアル化をあきらめました。

私はパネルを返す関数で、私のDisplayableListクラスで保存されたPanelを交換してみました:

public class DisplayableList<T> : List<T> 
{ 
    private Func<Panel> getDisplay; 

    public DisplayableList(Func<Panel> func) 
    { 
     this.getDisplay = func; 
    }// end constuctor 

    public Panel Display 
    { 
     get 
     { 
      return getDisplay(); 
     }//end get 
    }//end Display 

}//end class 

保存される機能は、単純なgetメソッドです:

public Panel GetEmployeeDisplayPanel() 
{ 
    return EmpDisplayPanel; 
} 

私はまだしかし、シリアル化の例外を取得します。 Panelをシリアライズするより簡単に(コンテンツページで定義されている)関数をシリアライズしていますが、どうすればそれをやり遂げることができますか?

答えて

0

[Serializable]属性を使用する必要があります。 Herehereあなたはそれを使用する方法についていくつかの詳細なドキュメントとチュートリアルを持っています

関連する問題