Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何向usercontrol模板添加与gridview相同的行为<;栏目>;_C#_Asp.net_User Controls - Fatal编程技术网

C# 如何向usercontrol模板添加与gridview相同的行为<;栏目>;

C# 如何向usercontrol模板添加与gridview相同的行为<;栏目>;,c#,asp.net,user-controls,C#,Asp.net,User Controls,为asp gridview和标记列定义标记时,只能从预定义的控件集中选择要添加到其中的控件(asp:BoundField、asp:ButtonField等)。 我很好奇是否可以添加相同类型的行为,比如说将内容限制为一个自定义控件,并将属性“Text”和“ImageUrl”限制为标准usercontrol中定义的TemplateContainer,然后以某种方式从代码隐藏中处理容器中每个元素的呈现?FYI字段(asp:BoundField、asp:ButtonField等)实际上不是控件,而是从D

为asp gridview和标记列定义标记时,只能从预定义的控件集中选择要添加到其中的控件(asp:BoundField、asp:ButtonField等)。

我很好奇是否可以添加相同类型的行为,比如说将内容限制为一个自定义控件,并将属性“Text”和“ImageUrl”限制为标准usercontrol中定义的TemplateContainer,然后以某种方式从代码隐藏中处理容器中每个元素的呈现?

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


如果您的控件都来自同一个类或实现同一个接口,那么应该可以实现类似的功能。

我想您可能需要这样的功能:

如果要为GridView创建自定义列类型,首先需要确定列的每个单元格中包含的内容。它只是一个文本框或按钮?还是更复杂的内容?如果更复杂,则需要通过继承ITemplate来创建自己的模板类

完成后,您需要编写一个从正确的列类型继承的类(对于简单列,BoundField、ButtonField等;如果需要插入自己的模板,则需要TemplateField)


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

好的,我终于解决了它,这意味着我可以做以下工作

<%@ 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都是应用程序代码中的自定义类,请注意,我必须注册应用程序代码程序集,以便标记能够识别该类。 命名空间指向类的位置。 对于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;
    }
}
private List items=new List();
[PersistenceMode(PersistenceMode.InnerProperty)、DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
公共清单项目
{
得到
{
if(items==null)
{
项目=新列表();
}
退货项目;
}
设置
{
项目=价值;
}
}

当需要渲染时,usercontrol可以处理:)

在进行一些测试时,向usercontrol添加DataControlFieldCollection属性可以让我插入DataControlField,就像gridview一样,这是一个很好的开始。然而,我猜我必须以某种方式派生出我自己的集合,正如你所说,它有自己的自定义DataControlFields集。我不可能是第一个尝试这样做的人,任何能引导我进一步进入光的想法都将被高度赞赏:)很棒的文章,谢谢!尽管我需要弄清楚如何将其应用于上面提到的自定义控件集合。很抱歉,我很晚才回到这里,但看起来您还是得到了它!:)