2008-08-27 13 views
4

ユーザーが選択した列に応じて動的にデータビューに追加されるASP.Netデータビュー列テンプレートがいくつかあります。動的に追加されたWeb.UI.ITemplateクラスのベストプラクティス

これらのテンプレートの細胞は、カスタムデータ連結を処理する必要があります。

public class CustomColumnTemplate: 
    ITemplate 
{ 
    public void InstantiateIn(Control container) 
    { 
     //create a new label 
     Label contentLabel = new Label(); 

     //add a custom data binding 
     contentLabel.DataBinding += 
      (sender, e) => 
      { 
       //do custom stuff at databind time 
       contentLabel.Text = //bound content 
      }; 

     //add the label to the cell 
     container.Controls.Add(contentLabel); 
    } 
} 

... 

myGridView.Columns.Add(new TemplateField 
    { 
     ItemTemplate = new CustomColumnTemplate(), 
     HeaderText = "Custom column" 
    }); 

は、第一に、これはかなり厄介なようだが、リソースの問題もあります。 Labelが生成され、InstantiateInに処分することはできません。これは、データバインドには存在しないからです。

これらのコントロールに適したパターンはありますか?

ラベルがデータバインド後に廃棄されてレンダリングされることを確認する方法はありますか?

答えて

2

私はテンプレートコントロールで広く作業しており、より良い解決策を見つけることはできませんでした。

なぜイベントハンドラ内のcontentLableを参照していますか?

送信者は、ラベルにキャストし、ラベルを参照できるラベルです。以下のように。

 //add a custom data binding 
     contentLabel.DataBinding += 
      (object sender, EventArgs e) => 
      { 
       //do custom stuff at databind time 
       ((Label)sender).Text = //bound content 
      }; 

次に、InstantiateInでラベル参照を処分することができます。

私はこれをテストしていませんのでご注意ください。

1

テンプレートをIDisposableに実装し、コントロールをテンプレートのDisposeメソッドに配置することです。もちろん、これはあなたが作成したコントロールを追跡するために何らかのコレクションを必要とすることを意味します。ここではそれについて移動するための1つの方法は次のとおりです。

public class CustomColumnTemplate : 
    ITemplate, IDisposable 
{ 
    private readonly ICollection<Control> labels = new List<Control>(); 

    public void Dispose() 
    { 
     foreach (Control label in this.labels) 
      label.Dispose(); 
    } 

    public void InstantiateIn(Control container) 
    { 
     //create a new label 
     Label contentLabel = new Label(); 

     this.labels.Add(contentLabel); 

...

 //add the label to the cell 
     container.Controls.Add(contentLabel); 
    } 
} 

は今、あなたがまだテンプレートを配置する問題に直面しています。しかし、テンプレート上でDisposeと呼ぶと、すべてのラベルがそれに伴って処分されるため、テンプレートは責任あるメモリ消費者になります。

UPDATE

This link on MSDNコントロールは、ページのコントロールツリーに根ざし、自動的にフレームワークによって配置されることになるので、おそらくそれはIDisposableを実装するテンプレートのために必要ではないことを示唆しています!

関連する問題