Пользовательский элемент управления ASP.NET, раздел шаблона позволяет только добавлять собственный класс внутри
Я хочу расширить gridview, добавить настраиваемое поле шаблона, в котором я могу ввести ТОЛЬКО 1 тип элемента, а именно (несколько) <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; }
}
}
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>
{
}
НТН!
bovako