如何在用户控件 - 掩码属性编辑器问题中为公开的属性使用内置编辑器

时间:2016-03-30 11:39:27

标签: c# winforms user-controls windows-forms-designer maskedtextbox

我认为我的愚蠢问题有一个简单的解决方案,但我今天无法解决。

我有一个用户控件,其本身具有angular.module('XYZ') .config(function($routeProvider) { console.log("Configuring routes"); $routeProvider.when('/login', { templateUrl: "./templates/login.html", controller: "LoginController", controllerAs: "loginCtrl" }) }); 控件。我还公开了一些属性供用户修改。

其中一个属性是MaskedTextBox属性,我想公开它,能够使用预定义的值启动编辑器,就像在普通的MaskedTextBox控件中一样。

所以我创建了一个公共属性InputMask并设置了所有内容以便它可以工作但是在显示编辑器之后,我得到一个包含此错误的错误对话框:

  

对象引用未设置为对象的实例

如果我不使用编辑器并复制掩码或通过代码设置它没有问题。

以下是代码示例:

Mask

1 个答案:

答案 0 :(得分:2)

在正常情况下,注册ui类型编辑器就足够了,你不需要做任何额外的事情。但在MaskPropertyEditor案例中,编辑属性时,编辑器会希望该属性属于MaskedTextBox并将ITypeDescriptorContext.Instance转换为MaskedTextBox,因为我们正在编辑Mask属性属于我们的UserControl,它不是一个蒙版文本框,会抛出一个空引用异常。

要解决此问题,您需要创建自定义UITypeEditor并覆盖EditValue并修改私有Mask字段的MaskedTextBox属性。为此,我们需要创建一个包含ITypeDescriptorContext的{​​{1}}实例,并将其传递给编辑器的MaskedTextBox方法。

以下是实施。

<强>用户控件

EditValue

<强>编辑

public partial class UserControl1 : UserControl
{
    MaskedTextBox maskedTextBox;
    public UserControl1()
    {
        InitializeComponent();
        maskedTextBox = new MaskedTextBox();
    }

    [Editor(typeof(MaskEditor), typeof(UITypeEditor))]
    public string Mask
    {
        get { return maskedTextBox.Mask; }
        set { maskedTextBox.Mask = value; }
    }
}

ITypeDescriptionContext实施

public class MaskEditor : UITypeEditor
{
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.Modal;
    }
    public override object EditValue(ITypeDescriptorContext context, 
                                     IServiceProvider provider, object value)
    {
        var field = context.Instance.GetType().GetField("maskedTextBox",
                       System.Reflection.BindingFlags.NonPublic | 
                       System.Reflection.BindingFlags.Instance);
        var maskedTextBox = (MaskedTextBox)field.GetValue(context.Instance);
        var maskProperty = TypeDescriptor.GetProperties(maskedTextBox)["Mask"];
        var tdc = new TypeDescriptionContext(maskedTextBox, maskProperty);
        var editor = (UITypeEditor)maskProperty.GetEditor(typeof(UITypeEditor));
        return editor.EditValue(tdc, provider, value);
    }
}