3

Açık bir özellik için yerleşik editörler nasıl kullanılır? Aptalca sorusu için basit bir çözüm olduğunu düşünüyorum, ancak bunu bugün çözemiyorum.Kullanıcı Denetimleri - Maske Özellik Düzenleyicisi Sayı

İçinde MaskedTextBox Denetimi bulunan bir Kullanıcı Denetimi var. Ayrıca, kullanıcının değiştirmesi için özelliklerinden birkaçını açığa çıkardım.

Bu özelliklerden biri, normal bir MaskedTextBox denetiminde olduğu gibi önceden tanımlanmış değerler içeren bir düzenleyici başlatma özelliği ile ortaya çıkarmak istediğim Mask özelliğidir.

Yani bir ortak özelliği ınputmask yarattı ve işe böylece her şeyi kurmak ama editör gösterdikten sonra, bu hatayı içeren bir hata iletişim kutusu:

Object reference not set to an instance of an object

i editörü kullanmıyorsanız ve bir maskeyi kopyalayın ya da kodu ayarlamak, sorunsuz bir şekilde çalışır. İşte

bir kod örneği şudur: ui tipi editörü kayıt için yeterli

... 
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

vaka. Normal durumlarda, ui tip editörünü kaydetmek yeterlidir ve ekstra bir şey yapmanıza gerek yoktur. Ancak 'MaskPropertyEditor' durumunda, özelliği düzenlerken editör, mülkün bir' MaskedTextBox''a ait olmasını bekler. Bu yüzden, 'MaskedTextBox'un 'Maske' özelliğini tam olarak düzenlemelisiniz. –

cevap

2

Normal durumlarda ve fazladan bir şey yapmanız gerekmez. Ancak, MaskPropertyEditor durumunda, özelliği düzenlerken, editör mülkün MaskedTextBox'a ait olduğunu ve'u MaskedTextBox'a dönüştürdüğünü ve düzenlememiz Mask özelliğinin maskelenmiş metin kutusu olmayan UserControl'a ait olduğundan, boş bir başvuru istisnası atar.

sorunu çözmek için, özel bir UITypeEditor oluşturup EditValue geçersiz kılmak ve özel MaskedTextBox alanın Mask özelliğini düzenlemeniz gerekir. Bunu yapmak için, MaskedTextBox'u içeren ITypeDescriptorContext örneğini oluşturmalı ve editörün EditValue yöntemine geçirmeliyiz.

İşte uygulamalar.

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

Editör

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 Uygulanması Bu o kadar basit değil

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

Çok teşekkür ederim. Harika çalışıyor. Ben bir C# geliştiriciden daha fazla bir Photoshop çalışanıyım (Tasarımcı 10 yılı aşkın bir süredir), fakat bir kaç kez bir windows form uygulaması için güzel bir kullanıcı arayüzü tasarladım ve uyguladığın için teşekkürler. Teşekkür ederim. – Dino