我创建了一个名为MaskedHexTextBox的类,它继承自MaskedTetxBox,使其只接受HEX值。无论如何,我需要做以下事情:
一般情况下,我如何为Mask和PromtChar设置默认值,是否有一个特定的事件,一旦控件放在窗体上,我就可以使用它来赋予这些属性默认值?
我使用类构造函数来执行此操作:
public MaskedHexTextBox()
{
Mask = "\\0xAAAA";
PromptChar = '0';
MaxLength = Mask.Replace("\\", string.Empty).Length;
}
在Form_load事件中,我仍然看到MaxLength的值是32767
private void Form1_Load(object sender, EventArgs e)
{
MessageBox.Show(maskedHexTextBox1.MaxLength.ToString());
}
另一个问题,假设MaxLength是正确的,如果从表单设计中更改了MaxLength更新的掩码,我该如何确保?
答案 0 :(得分:0)
关于Mask
和PromptChar
属性,如果您希望设计人员使用自定义默认值而不是基本默认值,那么您必须通过一些辅助类关联它们(如{{1}覆盖Designer
)或隐藏基本属性,声明具有相同名称的新属性,如:
PreFilterProperties
对于[Localizable(true), RefreshProperties(RefreshProperties.Repaint)]
[DefaultValue('0')]
public new char PromptChar
{
get { return base.PromptChar; }
set { base.PromptChar = value; }
}
[MergableProperty(false), Localizable(true), RefreshProperties(RefreshProperties.Repaint)]
[Editor("System.Windows.Forms.Design.MaskPropertyEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
[DefaultValue("\\0xAAAA")]
public new string Mask
{
get { return base.Mask; }
set { base.Mask = value; }
}
属性,理论上你应该覆盖它,但是类MaxLength
提供了一个空的set访问器,它永远不会改变底层的MaskedTextBox
字段,因此你无法通过基础进行更改属性。
然而,您可以尝试反思,最终改善您的TextBoxBase.maxLength
属性:
Mask
如果您还希望设计人员可以看到[MergableProperty(false), Localizable(true), RefreshProperties(RefreshProperties.Repaint)]
[Editor("System.Windows.Forms.Design.MaskPropertyEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
[DefaultValue("\\0xAAAA")]
public new string Mask
{
get { return base.Mask; }
set
{
if (base.Mask != value)
{
base.Mask = value;
//FIX_20141127
//MaxLengthProperty_Set.Invoke(this, new object[] { Mask.Replace("\\", string.Empty).Length });
SetMaxLength(Mask.Replace("\\", string.Empty).Length);
}
}
}
//FIX_20141127
private void SetMaxLength(int value)
{
if (IsHandleCreated)
{
MaxLengthProperty_Set.Invoke(this, new object[] { value});
MaxLengthField.SetValue(this, value);
}
}
private static readonly PropertyInfo MaxLengthProperty = typeof(TextBoxBase).GetProperty("MaxLength", BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);
private static readonly MethodInfo MaxLengthProperty_Set = MaxLengthProperty.GetSetMethod();
//FIX_20141127
private static readonly FieldInfo MaxLengthField = typeof(TextBoxBase).GetField("maxLength", BindingFlags.Instance | BindingFlags.NonPublic);
属性,则可以添加:
MaxLength
UPDATE_20141127(A) 为了解决TextBoxBase.MaxLength似乎没有改变的事实,你可以覆盖OnHandleCreated:
[Browsable(true), EditorBrowsable(EditorBrowsableState.Always)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[ReadOnly(true)]
public override int MaxLength
{
get { return base.MaxLength; }
set { }
}
UPDATE_20141127(B) 在以下链接中,您可以找到我的(工作)测试项目,其中包含一个最小的MaskedTextBox派生类和一个显示它的表单,以及一个用于更改Mask并检查MaxLength值的按钮。 Test project
在这个其他链接中,您可以找到上一个项目的已编译的exe。 Test exe
此致 丹尼尔。