3

私のばかげた質問には単純な解決策があると思いますが、今日は解決できません。ユーザーコントロール - マスクプロパティエディタで公開されたプロパティに組み込みエディターを使用する方法問題

ユーザーコントロールにはMaskedTextBoxコントロールがあります。私はまた、ユーザーが変更するためのいくつかのプロパティを公開しました。

これらのプロパティのうちの1つは、通常のMaskedTextBoxコントロールのように事前定義された値を持つエディタを起動する機能を公開したいという意味のMaskプロパティです。私は、エディタを使用していない場合は

Object reference not set to an instance of an object

だから私は、パブリックプロパティInputMaskを作成し、それが動作できるように、すべてのものを設定しますが、エディタを表示した後、私はこのエラーを含むエラーダイアログを取得しますマスクをコピーするかトラフのコードを問題なく設定できます。ここで

は、コードサンプルです:

... 
MaskedTextBox maskedtextbox; 
myUserControl() 
{ 
    ... 
    maskedtextbox = new MaskedTextBox(){ 
     some stuff... 
    }; 
} 

[DefaultValue("")] 
[Editor("System.Windows.Forms.Design.MaskPropertyEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))] 
[Localizable(true)] 
[MergableProperty(false)] 
[RefreshProperties(RefreshProperties.Repaint)] 
public string InputMask 
{ 
    get { return this.maskedtextbox.Mask; } 
    set { this.maskedtextbox.Mask = value; } 
} 
+0

それはこの中で、その単純ではありません場合。通常の場合、ui型エディタを登録するだけで十分です。何も追加する必要はありません。しかし、 'MaskPropertyEditor'の場合、プロパティを編集するとき、エディタはそのプロパティが' MaskedTextBox'に属することを期待します。したがって、 'MaskedTextBox'の' Mask'プロパティを正確に編集する必要があります。 –

答えて

2

通常のケースでは、それはUI型エディタを登録するには十分だとあなたは余分な何もする必要はありません。しかし、MaskPropertyEditorの場合、プロパティを編集するとき、プロパティはMaskedTextBoxに属し、ITypeDescriptorContext.InstanceMaskedTextBoxに変換され、編集済みMaskプロパティはマスク済みテキストボックスではないUserControlに属しているため、null参照例外がスローされます。

この問題を解決するには、カスタムUITypeEditorを作成し、EditValueを上書きし、プライベートMaskedTextBoxフィールドのMaskプロパティを編集する必要があります。これを行うには、MaskedTextBoxを含むITypeDescriptorContextのインスタンスを作成し、それをエディタのEditValueメソッドに渡す必要があります。

ここに実装があります。

のUserControl

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; } 
    } 
} 

エディタ

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); 
    } 
} 

ITypeDescriptionContext実装

public class TypeDescriptionContext : ITypeDescriptorContext 
{ 
    private Control editingObject; 
    private PropertyDescriptor editingProperty; 
    public TypeDescriptionContext(Control obj, PropertyDescriptor property) 
    { 
     editingObject = obj; 
     editingProperty = property; 
    } 
    public IContainer Container 
    { 
     get { return editingObject.Container; } 
    } 
    public object Instance 
    { 
     get { return editingObject; } 
    } 
    public void OnComponentChanged() 
    { 
    } 
    public bool OnComponentChanging() 
    { 
     return true; 
    } 
    public PropertyDescriptor PropertyDescriptor 
    { 
     get { return editingProperty; } 
    } 
    public object GetService(Type serviceType) 
    { 
     return editingObject.Site.GetService(serviceType); 
    } 
} 
+0

ありがとうございました。それは素晴らしい作品です。私はC#開発者よりもPhotoshopの人(デザイナーは10年以上)を務めていますが、私は数回手伝ってくれてありがとうございました。私はWindowsフォームアプリケーションの素晴らしいUIを設計し実装しました。ありがとうございました。 – Dino

関連する問題