0

我想扩展gridview,添加一个自定义模板字段,我只能在其中输入一种项目类型,即(多个)<Filter>项目。

所以例如我想要:

<FvmControls:FilteredGridView ID="fgvTest" runat="server">
    <Filters>
        <Filter labelText="ID" typeName="Int32" saveCookie="false" DBfield="Id" />
        <Filter labelText="Name" typeName="String" saveCookie="false" DBfield="Name" />
        <Filter labelText="Email" typeName="String" saveCookie="false" DBfield="Email" />
        <Filter labelText="Mobile Private" typeName="Boolean" saveCookie="false" DBfield="MobileIsPrivate" />
    </Filters>
    <Columns>
        ......
    </Columns>
</FvmControls:FilteredGridView>

现在我可以在我的模板字段中输入我想要的任何内容,我想将其限制为我选择的类(在本例中为单个类)。我怎样才能做到这一点?有这方面的好文章吗?下面是我试过的代码:

[ParseChildren(true), PersistChildren(true)]
    [ToolboxData("<{0}:FilteredGridView runat=\"server\"></{0}:FilteredGridView>")]
    public class FilteredGridView : GridView
    {
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        [PersistenceMode(PersistenceMode.InnerProperty)]
        [TemplateContainer(typeof(FilterCollection))]
        public FilterCollection Filters { get; set; }
    }

    public class FilterCollection : ITemplate
    {
        private List<Filter> _paramList = new List<Filter>();

        #region innerProperties
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        [PersistenceMode(PersistenceMode.InnerProperty)]
        public Filter filter
        {
            get { return filter; } // want to make private but then visual studio starts giving errors on the <param .... /> in front end
            set { _paramList.Add(value); }
        }
        #endregion

        public void InstantiateIn(Control container)
        {
        }
    }

    public class Filter
    {
        private Type _type;
        private String _typeName;
        private String _labelText = "";
        private Boolean _saveCookie = false;
        private Object _value;
        private String _dbfield;

        public String labelText
        {
            get { return _labelText; }
            set { _labelText = value; }
        }
        public String typeName
        {
            private get { return _typeName; }
            set
            {
                String FullValue = value;
                if (!value.Contains("System.")) FullValue = value.Insert(0, "System.");
                this.type = Type.GetType(FullValue, true, true);
                _typeName = value;
            }
        }
        public Type type
        {
            get { return _type; }
            private set { _type = value; }
        }
        public Boolean saveCookie
        {
            get { return _saveCookie; }
            set { _saveCookie = value; }
        }
        public Object value
        {
            get { return _value; }
            set { _value = value; }
        }
        public String DBfield
        {
            get { return _dbfield; }
            set { _dbfield = value; }
        }
    }
4

2 回答 2

2

我认为您通过实现 ITemplate 使事情变得过于复杂,不确定您到底想要完成什么,但也许,您可以创建一个您实际想要使用的东西的列表,而不是创建一个允许您做所有事情的模板。 .(我猜是白名单与黑名单;)..

尝试这样的事情:

[ParseChildren(true), PersistChildren(true), DefaultProperty("Filters")] 
public class FilteredGridView : GridView 
{ 
    private FilterList _filters;  
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
    [PersistenceMode(PersistenceMode.InnerProperty)] 
    [TemplateContainer(typeof(FilteredGridView))] 
    public FilterList Filters { 
        get { return _filters; } 
        set { _filters = value; } 
    } 
} 

public class FilterList : List<Filter> 
{ 
}

博瓦科

于 2014-12-12T10:22:34.813 回答
0

你的救命稻草,这完全有效

于 2014-12-15T09:50:57.193 回答