如何将相同的行为作为gridview <columns> </columns>添加到usercontrol模板

时间:2009-07-24 20:54:50

标签: c# asp.net user-controls

在定义asp gridview的标记和标记 Columns 时,只能从预定义的一组控件中进行选择(asp:BoundField,asp:ButtonField等)。 />
我很好奇我是否可以添加相同类型的行为,比如将内容限制为具有属性“Text”和“ImageUrl”的自定义控件到标准用户控件中定义的TemplateContainer,然后处理容器中每个元素的呈现从某种程度上的代码背后?

3 个答案:

答案 0 :(得分:1)

好吧,我终于解决了它,这意味着我可以做到以下

<%@ Register src="~/Controls/Core/ContextMenu.ascx" tagname="ContextMenu" tagprefix="uc" %>
<%@ Register Assembly="App_Code" Namespace="Core.Controls.ContextMenu" TagPrefix="cc"   %>

<uc:ContextMenu ID="ContextMenuMain" runat="server">
    <Items>
      <cc:ContextMenuItem Text="New" ImageUrl="..." />
      <cc:ContextMenuItem Text="Save" ImageUrl="..." />
    </Items>
</uc:ContextMenu>

如果每个ContextMenuItem都是应用程序代码中的自定义类,请注意我必须注册app_code程序集才能使标记识别该类。 命名空间指向类的位置。 对于usercontrol背后的代码,我们只需添加:

private List<ContextMenuItem> items = new List<ContextMenuItem>();

[PersistenceMode(PersistenceMode.InnerProperty), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<ContextMenuItem> Items
{
    get
    {
        if (items == null)
        {
            items = new List<ContextMenuItem>();
        }

        return items;
    }

    set
    {
        items = value;
    }
}

用户控件在渲染时间时可以处理:)

答案 1 :(得分:0)

FYI字段(asp:BoundField,asp:ButtonField等)实际上不是控件,而是从DatControlField类派生的。同样,columns属性不是ITemplate,而是DataFieldCollection。

如果您的控件都来自同一个类或实现相同的接口,那么这样的事情应该是可能的。

答案 2 :(得分:0)

我想也许你想要这样的东西:

http://www.developer.com/net/asp/article.php/10917_3609991_1

如果要为GridView创建自定义列类型,则需要首先确定列的每个单元格中的内容。它只是一个TextBox还是Button?还是更复杂的东西?如果它更复杂,您需要通过继承ITemplate来创建自己的模板类。

完成后,您需要编写一个继承正确列类型的类(如果您需要插入自己的模板,则可以使用简单列的BoundField,ButtonField等或者TemplateField)。

您可以为自定义列类创建自己的属性(例如,Text和ImageUrl),但如果它是TemplateField,则必须实际循环遍历单元格以操纵组成每个单元格的控件的数据。这并不难,但它并不像使用BoundField和设置DataField属性那么容易。