如何公开用户控件内的GridView控件的列集合

时间:2009-05-27 13:12:20

标签: asp.net user-controls

请参阅编辑。

我希望能够在使用用户控件的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);
            }
        }
    }

    ...

}

编辑:

实际上它确实有效,但自动完成在uc:MyControl开始和结束标记之间不起作用,我收到编译器警告: -

  • 元素'MyControl'的开始和结束标记之间不允许使用内容。

  • 验证(XHTML 1.0 Transitional):不支持元素“列”。

  • 元素'BoundField'不是已知元素。如果网站中存在编译错误,或者缺少web.config文件,则会发生这种情况。

所以我想我需要使用某种指令来告诉编译器期望标签之间的内容。

有什么想法吗?

1 个答案:

答案 0 :(得分: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;
    }
}

Secand - 您可以在usercontrol标记内设置列集合,如

 <uc1:TControl ID="TControl1" runat="server" >
    <Columns>
      <asp:BoundField DataField="ID" HeaderText="UserID" />
      <asp:BoundField DataField="Name" HeaderText="UserName" />
    </Columns>
    </uc1:TControl>
  

Visual Studio将为列属性启用自动完成功能,但设计器将抛出异常

最后,您可以在用户控件中绑定gridview