如何覆盖maskedTextBox的MaxLength,Mask,PromptChar属性

时间:2014-11-25 21:06:43

标签: c# maxlength maskedtextbox

我创建了一个名为MaskedHexTextBox的类,它继承自MaskedTetxBox,使其只接受HEX值。无论如何,我需要做以下事情:

  • 在MaskedHexTextBox中为PromptChar提供默认值'0',并且仍然可以在表单设计中更改它
  • 为Mask添加默认值“\ 0xAAAAA”,并且仍然可以在表单设计中更改它
  • 使用Mask.Length作为MaxLength的默认值,我需要在某些计算中使用,如果我将控件放在表单上后更改了Mask,我仍然可以获得正确的Mask长度

一般情况下,我如何为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更新的掩码,我该如何确保?

1 个答案:

答案 0 :(得分:0)

关于MaskPromptChar属性,如果您希望设计人员使用自定义默认值而不是基本默认值,那么您必须通过一些辅助类关联它们(如{{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


此致 丹尼尔。