你需要为你的这个属性写一个TypeConverter(类型转换器),我上面提供的链接文章说的就是这个问题:How can I supply a list of values to be chosen from a dropdown list at runtime for a specific type similar to enums? 如果看不懂,再看看这个: http://morganskinner.dnsalias.net/Articles/AStructTypeConverter/ 这篇文章中没有重写GetStandardValuesSupported和GetStandardValuesExclusive这两个属性,这是实现你的要求的必要条件,如果你还看不懂,我只好找时间给你写一个了!:)
我把字段类型写成System.Web.UI.Controlpublic class WebataBind :System.Web.UI.Control,IPostBackEventHandler,INamingContainer
{
......./// <summary>
///
/// </summary>
[Category("MyProperty"), Description("字段影射的控件")]
public System.Web.UI.Control Ctrl
{
get
{
return (System.Web.UI.Control)ViewState["Ctrl"];
}
set
{
ViewState["Ctrl"] = value;
}
}
}这样就能实现
不过输出有错误啊
无法为“System.Web.UI.Control”类型的值生成代码。试图为 Ctrl 生成属性值时出现此错误。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Web.HttpException: 无法为“System.Web.UI.Control”类型的值生成代码。试图为 Ctrl 生成属性值时出现此错误。源错误: 执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。 堆栈跟踪:
[HttpException (0x80004005): 无法为“System.Web.UI.Control”类型的值生成代码。试图为 Ctrl 生成属性值时出现此错误。]
System.Web.Compilation.CodeDomUtility.GenerateExpressionForValue(PropertyInfo propertyInfo, Object value, Type valueType) +2252
System.Web.Compilation.TemplateControlCompiler.BuildBuildMethod(ControlBuilder builder, Boolean fTemplate, PropertySetterEntry pse) +2550
System.Web.Compilation.TemplateControlCompiler.BuildSourceDataTreeFromBuilder(ControlBuilder builder, Boolean fInTemplate, PropertySetterEntry pse) +794
System.Web.Compilation.TemplateControlCompiler.BuildSourceDataTreeFromBuilder(ControlBuilder builder, Boolean fInTemplate, PropertySetterEntry pse) +675
System.Web.Compilation.TemplateControlCompiler.BuildSourceDataTreeFromBuilder(ControlBuilder builder, Boolean fInTemplate, PropertySetterEntry pse) +675
System.Web.Compilation.TemplateControlCompiler.BuildSourceDataTreeFromBuilder(ControlBuilder builder, Boolean fInTemplate, PropertySetterEntry pse) +352
System.Web.Compilation.TemplateControlCompiler.BuildSourceDataTreeFromBuilder(ControlBuilder builder, Boolean fInTemplate, PropertySetterEntry pse) +352
System.Web.Compilation.TemplateControlCompiler.BuildMiscClassMembers() +52
System.Web.Compilation.PageCompiler.BuildMiscClassMembers() +10
System.Web.Compilation.BaseCompiler.BuildSourceDataTree() +1275
System.Web.Compilation.BaseCompiler.GetCompiledType() +129
System.Web.UI.PageParser.CompileIntoType() +60
System.Web.UI.TemplateParser.GetParserCacheItemThroughCompilation() +124[HttpException (0x80004005): 无法为“System.Web.UI.Control”类型的值生成代码。试图为 Ctrl 生成属性值时出现此错误。]
System.Web.UI.TemplateParser.GetParserCacheItemInternal(Boolean fCreateIfNotFound) +692
System.Web.UI.TemplateParser.GetParserCacheItem() +32
System.Web.UI.TemplateControlParser.CompileAndGetParserCacheItem(String virtualPath, String inputFile, HttpContext context) +116
System.Web.UI.TemplateControlParser.GetCompiledInstance(String virtualPath, String inputFile, HttpContext context) +36
System.Web.UI.PageParser.GetCompiledPageInstanceInternal(String virtualPath, String inputFile, HttpContext context) +43
System.Web.UI.PageHandlerFactory.GetHandler(HttpContext context, String requestType, String url, String path) +44
System.Web.HttpApplication.MapHttpHandler(HttpContext context, String requestType, String path, String pathTranslated, Boolean useAppConfig) +699
System.Web.MapHandlerExecutionStep.System.Web.HttpApplication+IExecutionStep.Execute() +95
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +173 怎么回事????????????????????????
应该是这个属性标记有问题
MyProperty这个类型从那来的?
他是做好了一些用户控件,通过用户的选择,动态装载这些控件以达到那种效果
如果看不懂,再看看这个:
http://morganskinner.dnsalias.net/Articles/AStructTypeConverter/
这篇文章中没有重写GetStandardValuesSupported和GetStandardValuesExclusive这两个属性,这是实现你的要求的必要条件,如果你还看不懂,我只好找时间给你写一个了!:)
麻烦了
就是把WebControlCollection当作我的TypeConverter里的Values返回各位大哥大姐帮忙看一下阿谢谢了
{
ArrayList ctrls=new ArrayList();
ctrls.Add("None");
IDesignerHost host=(IDesignerHost)context.GetService(typeof(System.ComponentModel.Design.IDesignerHost));
IContainer container=host.Container;
if(container!=null)
{
for(int i=0;i<container.Components.Count;i++)
{
IComponent compt=container.Components[i];
if(compt is TextBox)
{
ctrls.Add(((TextBox)compt).ID);
}
}
}
return new StandardValuesCollection(ctrls);
}
你可以参考:
http://expert.csdn.net/Expert/TopicView1.asp?id=2620821
webdiyer(陕北吴旗娃)
anbeel(Coding人生) 借此机会给大家拜个早年,祝生意兴隆