自定义UserControl的属性为什么不能在设计时显示在属性窗口中

解决方法:
    假如你写了一个自定义控件,类名为MyUserControl, 文件名为MyUserControl.ascx, 命名空间为MyWeb.Controls。然后你将MyUserControl拖到一个WebForm上,会自动生成:
<%@ Register TagPrefix="uc1" TagName="ImageList" Src="Controls/ImageList.ascx" %><%@ Register TagPrefix="uc1" TagName="ImageList" Src="Controls/ImageList.ascx" %><%@ Register TagPrefix="uc1" TagName="ImageList" Src="Controls/ImageList.ascx" %><%@ Register TagPrefix="uc1" TagName="ImageList" Src="Controls/ImageList.ascx" %><%@ Register TagPrefix="uc1" TagName="ImageList" Src="Controls/ImageList.ascx" %><%@ Register TagPrefix="uc1" TagName="MyUserControl" Src="MyUserControl.ascx" %>
将上面的语句改为
<%@ Register TagPrefix="uc1" Namespace="MyWeb.Controls" Assembly="MyWeb"%>
这样,就会在属性窗口看到你定义的属性。

<%@ Register TagPrefix="uc1" Namespace="JiTongWeb.Controls" Assembly="JiTongWeb"%>
问题解决过程:
    这个问题困扰了我很久,以前我只能手动写代码给自己写的UserControl的属性赋值。昨天,我下定决心一定要解决这个问题,在网上找了很多文章,按照文章中的代码作了很多次修改,比如:在类名前加
[ System.ComponentModel.Designer(typeof(System.Web.UI.Design.ControlDesigner)),
 ToolboxData("<{0}:ImageList runat=\"server\" />") ]
我总以为是UserControl本身定义的问题,所以把注意力集中在UserControl的代码上, 而这是一个错误的方向,无论我怎么努力,也不能解决问题。后来,我想到.Text中有一个能在设计时显示属性的分页控件,我为何不参考一下,我按照它改写了自己的控件,可放到WebForm上后还是不能看到属性,然后,我查看了WebForm中自动生成的代码, 发现了不同之处,我按照上面的方法改了一下,问题就解决了。而且在UserControl中,不需要对属性作特别的设置, 只要是public属性都会显示在属性窗口中。
    在学习过程中,实践显得多么重要,比如上面的问题,仅仅看看相关文章,你觉得很简单,如果你不写代码去试一下,根本不会发现这个问题。


“DUDU的说法不对,只需要一行就行了
<%@ Register TagPrefix="uc1" Namespace="MyWeb.Controls" Assembly="MyWeb"%>

要注意Namespace和Assembly的设置,你的控件如果有特殊的命名空间,则要设置好,Assembly一般是web应用程序的命名空间,例如myweb,如果控件和应用程序都在同一个命名空间,则设置成一样。

而且控件要经过编译,里面的属性才能在属性窗口显示出来,可以用重新生成工程来编译程序。

注意一定要是 属性 才能显示出来,一般的public是不能显示出来的,要使用get和set。

欢迎大家和我讨论.net的问题,我的blogs是:http://blog.csdn.net/delphier
http://www.cnblogs.com/wwwljx
posted @ 2004-03-25 10:46 dudu 阅读(5936) 评论(31)  编辑 收藏 所属分类: ASP.NET 1.1

  回复  引用  查看    
#1楼 2004-03-25 13:22 | 雨玲珑      

昨天我也刚好碰到了类似问题,和你的问题刚好相反

自定义一个Web user Control 设计时添加一个Button但是采用<%@ Register TagPrefix="uc1" Namespace="MyWeb.Controls" Assembly="MyWeb"%>添加控件时代码 this.button1.text =”"asdb”";中提示未将对象引用到实例。然而换成<%@ Register TagPrefix="uc1" TagName="MyUserControl" Src="MyUserControl.ascx" %>这种方式就不会出现错误。不知道这是为啥。


  回复  引用  查看    
#2楼 2004-03-25 13:53 | dudu      
我试了一下,果然会出现你所说的问题。但有个更好的解决方法:让这两行并存,即
<%@ Register TagPrefix="uc1" TagName="MyUserControl" Src="MyUserControl.ascx" %>
<%@ Register TagPrefix="uc1" Namespace="MyWeb.Controls" Assembly="MyWeb"%>
不好意思,我原来的解决方法也是有问题,正确的方法应该是增加一行,而不是修改原来@ Register 。

  回复  引用  查看    
#3楼 2004-03-25 16:30 | 小春      
dudu.
我按你的方法怎么不行的?

  回复  引用  查看    
#4楼 2004-03-25 16:35 | dudu      
Namespace="MyWeb.Controls"要改成你的usercontrol所在的命名空间。
  回复  引用    
#5楼 2004-03-25 16:47 | 小春 [未注册用户]
我将命名空间改成你的 MyWeb.Controls
定义了f_left 属性.
<%@ Register TagPrefix="uc1" Namespace="MyWeb.Controls" Assembly="MyWeb"%>
<%@ Register TagPrefix="uc1" TagName="aaa" Src="aaa.ascx" %>
<%@ Register TagPrefix="uc1" Namespace="MyWeb.Controls"%>

好像在属性窗口上看不到.我以前都是手工去写值给它赋值的
  回复  引用    
#6楼 2004-03-25 16:48 | 小春 [未注册用户]
<%@ Register TagPrefix="uc1" TagName="aaa" Src="aaa.ascx" %>
<%@ Register TagPrefix="uc1" Namespace="MyWeb.Controls"%>
  回复  引用  查看    
#7楼 2004-03-25 16:54 | dudu      
应该这样写:<%@ Register TagPrefix="uc1" Namespace="MyWeb.Controls" Assembly="MyWeb"%>
<%@ Register TagPrefix="uc1" TagName="aaa" Src="aaa.ascx" %>, 你重启一下VS.NET再试试。
  回复  引用    
#8楼 2004-03-25 17:02 | 小春 [未注册用户]
我还是不是,我是assembly 出错,
发个代码给我吧 8926304aaa@21cn.com
  回复  引用  查看    
#9楼 2004-03-25 18:57 | dudu      
不好意思, 雨玲珑的问题并没有解决, 当时没有重启VS.NET, 小春的问题正是由于用了两行@ Register。要显示属性, 还是应该这样<%@ Register TagPrefix="uc1" Namespace="MyWeb.Controls" Assembly="MyWeb"%>,而且建议将uc1改成其他的名称, 不然就无法将usercontrol再拖到WebForm上。 但这样设置就会出现雨玲珑遇到的问题。不知什么原因?

  回复  引用  查看    
#10楼 2004-03-25 19:28 | Dream      
呵呵,还真热闹!
  回复  引用    
#11楼 2004-03-26 08:15 | 小春 [未注册用户]
那还有什么方法吗?
像自定义控件一样,为什么这个在自定义控件里不起作用呢?
System.ComponentModel

<browsable(False)> Public Property lblLeftText() As String

这样子应该是能显示出属性的,为什么不行?

期待!
  回复  引用    
#12楼 2004-03-26 08:19 | 小春 [未注册用户]
<browsable(true)> Public Property lblLeftText() As String

  回复  引用    
#13楼 2004-04-15 21:48 | lpxp [未注册用户]
我也遇到过这个问题,就是在codebehind里面用this.usercontrol1.visible不能用,.visible属性不能显示?
  回复  引用    
#14楼 2004-07-07 10:10 | 伯伯 [未注册用户]
assembly 出错是因为你的 名字取得有问题,加个后缀就可以了!不信你试试!
  回复  引用    
#15楼 2004-09-06 16:03 | silentvolcano [未注册用户]
搞定了吗?好像不行哦。
  回复  引用    
#16楼 2004-09-08 06:46 | 吉鹏 [未注册用户]
     如果真是这样则的确是个好消息,我在这个问题上也摸索了很久不得要领。在csdn上发现了这里的链接,没等试成就高兴的急忙散了分。
     我按照你的方法试了N+1次了,仍然未见其属性显示在属性窗口中。我用的是vs2003.
     麻烦你发一个已实现的代码好吗?手工填写属性实在很烦哪。
      
  回复  引用    
#17楼 2004-09-08 06:49 | 吉鹏 [未注册用户]
 我的信箱是 aspdotnet@yeah.net
  回复  引用    
#18楼 2004-09-09 13:14 | 江河万古流 [未注册用户]
牛兄还是贴个源码给看看啊,我除了4个每个控件都有的属性看的到,自定义的属性一个也没看见。
  回复  引用    
#19楼 2004-09-10 10:37 | sanlang [未注册用户]
呵呵,这个问题有点怪。
在HTML视图中把这三个Page指令的按如下顺序排列
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="MyWeb.Controls.WebForm1" %> 
<%@ Register TagPrefix="uc1" Namespace="MyWeb.Controls" Assembly="MyWeb"%> 
<%@ Register TagPrefix="uc1" TagName="aaa" Src="aaa.ascx" %> 
别点保存,然后转换到视图,就可以在属性窗口看到控件的属性了。
不过保存好后,HTML视图中的三个Page指令的顺序不是按上述排列,属性又看不到了。:(。但再按上面顺序把PAGE指令调整好,又可看到属性了。
这是什么原因啊?哪个老大能不能说说其中的原因?
还有:如<%@ Register TagPrefix="uc1" TagName="aaa" Src="aaa.ascx" %> 大家可看看会出什么效果!
现在工作忙,乱写了这点东东。
QQ:14252055     MSN:wilsonchen1999@hotmail.com
  回复  引用    
#20楼 2004-09-10 10:38 | sanlang [未注册用户]
上面有句写错:
还有:如把这句去掉<%@ Register TagPrefix="uc1" TagName="aaa" Src="aaa.ascx" %> 大家可看看会出什么效果!
(控件好象被load两次)
  回复  引用    
#21楼 2004-09-11 00:39 | kakon [未注册用户]
为这件事情整整浪费了我半天加一个晚上,简单办法就是:
page_load前一行加上(C#):
protected yourusercontrol1 yourusercontrol11
绝对有效,不用改造html,更不会、、、、、
相信MS没那么弱智吧。

VB为
protected yourusercontrol11 as yourusercontrol1 

  回复  引用    
#22楼 2004-09-14 23:27 | 王新 [未注册用户]
高手,你们好,你们所谈的属性是指自定义控件的绑定等属性,还是指其中的web控件的属性, 我遇到的问题是:为什么自定义控件中的部分web控件在代码中看不到声明?请赐教!
  回复  引用    
#23楼 2004-09-14 23:32 | 王新 [未注册用户]
为什么我按以上步骤做,出现不存在 Manager.controls的错误?
谢谢!

  回复  引用    
#24楼 2004-10-04 08:42 | 吉鹏 [未注册用户]
dudu:这样搞到底能不能行,我就没成功过,别把大家撂在这儿不管了,能否给个切实可行的办法,就这个样子也太吊大家的胃口了,急出毛病来你管哪?
  回复  引用  查看    
#25楼 2004-12-06 15:01 | 明月伴我行      
剛剛使用發現了這個問題,按照Dudu的方法,一切OK!
  回复  引用  查看    
#26楼 2005-01-26 13:57 |       
DUDU的说法不对,只需要一行就行了
<%@ Register TagPrefix="uc1" Namespace="MyWeb.Controls" Assembly="MyWeb"%>

要注意Namespace和Assembly的设置,你的控件如果有特殊的命名空间,则要设置好,Assembly一般是web应用程序的命名空间,例如myweb,如果控件和应用程序都在同一个命名空间,则设置成一样。

而且控件要经过编译,里面的属性才能在属性窗口显示出来,可以用重新生成工程来编译程序。

注意一定要是 属性 才能显示出来,一般的public是不能显示出来的,要使用get和set。

欢迎大家和我讨论.net的问题,我的blogs是:http://blog.csdn.net/delphier
http://www.cnblogs.com/wwwljx
  回复  引用  查看    
#27楼 [楼主]2005-01-26 13:59 | dudu      
@星
谢谢你!
我的方法是有问题。
  回复  引用  查看    
#28楼 2006-06-19 15:53 | lazylu      
@星
按你的做法,属性是能够显示出来,但是访问网站的时候出错,错误是namespace是意外属性
  回复  引用    
#29楼 2006-07-03 11:06 | 青菜 [未注册用户]
我问一下,命名空间的一些设置问题,比如怎么样修改系统默认生成的名字,还有命名控件的层次关系怎么来弄?
  回复  引用    
#30楼 2006-10-09 20:09 | alvin[匿名] [未注册用户]
Assembly是组件名称,也即你编译后的dll的名称,
什么命名空间,乱讲.
TagPrefix是标记名称,如<mc:class名称>
Namespace 控件所属命名空间

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-01-26 14:02 编辑过


相关链接: