我在BoundField派生控件中为DataFormatString编写了以下覆盖,但该字段仍然格式化为普通数字。我假设这是因为格式化代码不是调用DataFormatString属性而是使用私有_dataField
字段。我想在我的覆盖中设置基本属性,但我想基于声明性FormatType
枚举属性来执行此操作,该属性将确定要使用的默认格式字符串。我在哪里可以做到这一点?
public override string DataFormatString
{
get
{
var baseString = base.DataFormatString;
if (!string.IsNullOrWhiteSpace(baseString))
{
return FormatStrings.Currency;
}
return baseString;
}
set
{
base.DataFormatString = value;
}
}
编辑:事实证明,当控件由其父级构建时,会设置声明性属性值,因此可以非常安全地假设它们在页面生命的这个阶段之后才会被正确使用周期。这就是我真正想知道的。
答案 0 :(得分:0)
您可以在方法顶部添加DefaultValue属性:
[DefaultValue(false)]
public bool SomeCondition
{
get { return someCondition; }
set { someCondition = value; }
}
答案 1 :(得分:0)
看起来无参数构造函数是执行此操作的最佳位置。我想基于其他属性将一些属性设置为默认值,但我意识到如果我在需要时确定这些默认值,而不是在属性getter中,则没有必要。 E.g:
public BoundReportField()
{
_formatType = FieldFormatTypes.String;
}
protected virtual string GetDefaultFormatString(FieldFormatTypes formatType)
{
var prop = typeof(FormatStrings).GetProperty(formatType.ToString()).GetValue(null, null);
return prop.ToString();
}
protected virtual IFormatProvider GetFormatProvider(FieldFormatTypes formatType)
{
var info = (CultureInfo)CultureInfo.CurrentCulture.Clone();
info.NumberFormat.CurrencyDecimalDigits = 0;
info.NumberFormat.CurrencySymbol = "R";
info.NumberFormat.CurrencyGroupSeparator = ",";
info.NumberFormat.CurrencyDecimalSeparator = ".";
return info;
}
private FieldFormatTypes _formatType;
public virtual FieldFormatTypes FormatType
{
get { return _formatType; }
set
{
_formatType = value;
}
}
protected override string FormatDataValue(object dataValue, bool encode)
{
var formatString = DataFormatString;
var formatProvider = GetFormatProvider(_formatType);
if (string.IsNullOrWhiteSpace(formatString))
{
formatString = GetDefaultFormatString(_formatType);
}
ApplyFormatStyles(_fieldCell);
var retString = string.Format(formatProvider, formatString, dataValue);
return retString;
}