2009-05-27 3 views
1

編集を参照してください。ユーザーコントロール内にあるGridViewコントロールの列コレクションを公開する方法

これは、ユーザーコントロールを消費するaspxでこれを実行できるようにしたいと考えています。

<uc:MyControl ID="MyGrid" runat="server"> 
    <asp:BoundField DataField="FirstColumn" HeaderText="FirstColumn" /> 
    <asp:BoundField DataField="SecondColumn" HeaderText="SecondColumn" /> 
</uc> 

私はこのコードを(これは動作しません)持っています。私が間違っていることは何ですか?

VB

Partial Public Class MyControl 
    Inherits UserControl 

    <System.Web.UI.IDReferenceProperty(GetType(DataControlFieldCollection))> _ 
    Public Property Columns() As DataControlFieldCollection 
     Get 
      Return MyGridView.Columns 
     End Get 
     Set(ByVal value As DataControlFieldCollection) 
      ' The Columns collection of the GridView is ReadOnly, so I rebuild it 
      MyGridView.Columns.Clear() 
      For Each c As DataControlField In value 
       MyGridView.Columns.Add(c) 
      Next 
     End Set 
    End Property 

    ... 

End Class 

C#

public partial class MyControl : UserControl 
{ 
    
    [System.Web.UI.IDReferenceProperty(typeof(DataControlFieldCollection))] 
    public DataControlFieldCollection Columns { 
        get { return MyGridView.Columns; } 
        set { 
            MyGridView.Columns.Clear(); 
            foreach (DataControlField c in value) { 
                MyGridView.Columns.Add(c); 
            } 
        } 
    } 

    ... 

} 

EDIT:

実際には機能しますが、自動補完がUCの間では動作しません:MyControlとの開始タグと終了タグと私はコンパイラを入手警告: -

  • エレメント 'MyControl'の開始タグと終了タグの間には、コンテンツが許可されていません。

  • 検証(XHTML 1.0 Transitional):要素 'columns'はサポートされていません。

  • 要素 'BoundField'は既知の要素ではありません。これは、Webサイトにコンパイルエラーがあるか、web.configファイルが見つからない場合に発生します。

私はタグの間にコンテンツを期待するようコンパイラに指示するために何らかの指示を使う必要があると思います。

アイデア?

答えて

3

することは、私は、この問題の解決策を発見した

ステップ1 - あなたのUserControl

[ MergableProperty(false), DefaultValue((string)null), 
Editor("System.Web.UI.Design.WebControls.DataControlFieldTypeEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", 
    typeof(UITypeEditor)), 
PersistenceMode(PersistenceMode.InnerProperty)] 
public virtual DataControlFieldCollection Columns 
{ 
    get 
    { 
     return GridView1.Columns; 
    } 
} 

ソフトオンデマンドに次のpropertを追加 - あなたは

<uc1:TControl ID="TControl1" runat="server" > 
    <Columns> 
     <asp:BoundField DataField="ID" HeaderText="UserID" /> 
     <asp:BoundField DataField="Name" HeaderText="UserName" /> 
    </Columns> 
    </uc1:TControl> 
のようなあなたのUserControlタグ内にあなたの列のコレクションを設定することができます

Visual Studioではcolumnsプロパティに対してオートコンプリートが有効になりますが、デザイナは例外をスローします

最終的に、ユーザーコントロール内でgridviewをバインドできます

関連する問題