我有一个关于默认值属性的问题。
当我在设计模式下将控件添加到页面时,默认值不起作用。这是我的代码:
[DefaultProperty("Text")]
[ToolboxData("<{0}:KHTLabel runat=server key=dfd></{0}:KHTLabel>")]
public class KHTLabel : Label ,IKHTBaseControl
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("KHT")]
[Localizable(true)]
public string Key
{
get
{
String s = (String)ViewState["Key"];
return ((s == null) ? String.Empty : s);
}
set
{
ViewState["Key"] = value;
}
}
protected override void RenderContents(HtmlTextWriter writer)
{......但是,在设计模式下,当我从工具箱添加控件时,该键并不存在
<cc1:KHTLabel ID="KHTLabel1" runat="server"></cc1:KHTLabel>发布于 2010-09-07 16:50:37
恐怕这不是[DefaultValue]属性的作用。它允许Visual Studio设计器(特别是“属性”网格)确定默认情况下要显示的内容,并因此知道如何在值与默认值不同时将其显示为粗体。
这取决于您的代码中是否包含将值"KHT“作为默认值的内容。在this 2008 blog posting of mine中有一些相关的细节。
下面的代码相当初级,我还没能验证它的编译情况,但是它应该能让您了解如何处理将DefaultValueAttribute的值“强制”到ViewState中
private string GetDefaultAttributeValueForProperty(string propertyName)
{
var attributesForProperty = (from prop in typeof(KHTLabel).GetProperties()
where prop.Name == propertyName
select System.Attribute.GetCustomAttributes(prop)).First();
var defaultValueAttribute = (from attr in attributesForProperty
where attr.GetType() == typeof(DefaultValueAttribute)
select ((DefaultValueAttribute)attr).Value).FirstOrDefault();
return Convert.ToString(defaultValueAttribute);
}
public KHTLabel()
{
ViewState["Key"] = GetDefaultAttributeValueForProperty("Key");
}发布于 2010-09-07 16:58:55
DefaultValueAttribute不用于设置属性的值。序列化程序使用它来确定是否应该序列化该值。您需要在构造函数中(或在OnInit中)设置属性的默认值。如果属性值与DefaultValueAttribute值匹配,则使用DefaultValueAttribute会使序列化数据更小。
发布于 2011-11-20 03:18:48
通过在ToolboxDataAttribute中显式命名第一个答案(<cc1:KHTLabel ID="KHTLabel1" runat="server" Key="KHT"></cc1:KHTLabel>),您可以获得您在备注中提到的结果。要使其也成为实际的默认值,您仍然必须在该属性的getter中返回该值。这会导致在您的类中重复三次相同的值。
顺便说一句,我不明白为什么你的ToolboxData中现在有key=dfd,而属性名是Key,并且是string类型。
[DefaultProperty("Text")]
[ToolboxData("<{0}:KHTLabel runat=server Key=\"KHT\"></{0}:KHTLabel>")]
public class KHTLabel : Label//, IKHTBaseControl
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("KHT")]
[Localizable(true)]
public string Key
{
get
{
var s = (String)ViewState["Key"];
return (s ?? "KHT");
}
set { ViewState["Key"] = value; }
}
protected override void RenderContents(HtmlTextWriter writer)
{
// TODO: Implement logic
}
}https://stackoverflow.com/questions/3657131
复制相似问题