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