2009-01-14 16 views
12

मैं सी # का उपयोग कर रहा हूं और एक खिड़की के रूप में एक संपत्ति ग्रिड नियंत्रण है।क्या एक पासवर्ड फ़ील्ड के रूप में एक संपत्ति ग्रिड में दिखाए गए एक संपत्ति को चिह्नित करना संभव है

मैंने संपत्तिग्रस्त के चयनित ऑब्जेक्ट को एक सेटिंग फ़ाइल में असाइन किया है, जो प्रदर्शित करता है और मुझे सेटिंग्स को संपादित करने देता है। हालांकि सेटिंग्स में से एक पासवर्ड है - और मैं इसे पासवर्ड सेटिंग के सादे पाठ मूल्य के बजाय क्षेत्र में तारों को प्रदर्शित करना चाहता हूं।

फ़ील्ड सहेजे जाने पर एन्क्रिप्ट किया जाएगा, लेकिन मैं इसे सामान्य पासवर्ड एंट्री बॉक्स की तरह व्यवहार करना चाहता हूं, जब उपयोगकर्ता पासवर्ड में प्रवेश कर रहा है।

मुझे आश्चर्य है कि क्या कोई विशेषता है जिसे सेटिंग संपत्ति पर पासवर्ड के रूप में चिह्नित करने के लिए लागू किया जा सकता है?

धन्यवाद।

उत्तर

20

नेट 2 के साथ शुरू, आप उपयोग कर सकते हैं PasswordPropertyTextAttribute अपना पासवर्ड संपत्ति से जुड़ी।

उम्मीद है कि इससे मदद मिलती है।

1

मुझे नहीं लगता कि आप तारक को स्वैप करने के लिए PropertyGrid प्राप्त कर सकते हैं, लेकिन आप शायद एक-तरफ़ा प्रकार कनवर्टर और एक मॉडल संपादक ... इसलिए की तरह इस्तेमाल कर सकते हैं:

using System; 
using System.ComponentModel; 
using System.Drawing.Design; 
using System.Windows.Forms; 
using System.Windows.Forms.Design; 
class Foo 
{ 
    [TypeConverter(typeof(PasswordConverter))] 
    [Editor(typeof(PasswordEditor), typeof(UITypeEditor))] 
    public string Password { get; set; } 

    // just to show for debugging... 
    public string PasswordActual { get { return Password; } } 
} 
class PasswordConverter : TypeConverter 
{ 
    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) 
    { 
     return destinationType == typeof(string) ? "********" : 
      base.ConvertTo(context, culture, value, destinationType); 


    } 
} 
class PasswordEditor : UITypeEditor 
{ 
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
    { 
     return UITypeEditorEditStyle.Modal; 
    } 
    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
    { 
     IWindowsFormsEditorService svc = (IWindowsFormsEditorService) 
      provider.GetService(typeof(IWindowsFormsEditorService)); 
     if (svc != null) { 
      TextBox tb; 
      Button btn; 
      Form frm = new Form { Controls = { 
       (tb = new TextBox { PasswordChar = '*', Dock = DockStyle.Top, 
        Text = (string)value}), 
       (btn = new Button { Text = "OK", Dock = DockStyle.Bottom, DialogResult = DialogResult.OK}) 
      }, AcceptButton = btn}; 

      if (frm.ShowDialog() == DialogResult.OK) 
      { 
       value = tb.Text; 
      } 
     } 
     return value; 
    } 
} 
static class Program { 
    [STAThread] 
    static void Main() { 
     Application.EnableVisualStyles(); 
     Application.Run(new Form { 
      Controls = { 
       new PropertyGrid { 
        Dock = DockStyle.Fill, 
        SelectedObject = new Foo { Password = "Bar"} 
       } 
      } 
     }); 
    } 
} 
+0

स्वीकार्य उत्तर कहता है कि आप कर सकते हैं (ओपी ने क्या पूछा)! – noelicus

1

यहाँ क्या मैं अतीत में किया गया है। यह ग्रिड में पासवर्ड के लिए "********" प्रदर्शित करता है, जिसमें "..." बटन होता है जिससे उपयोगकर्ता पासवर्ड सेट कर सकता है (आपके द्वारा आपूर्ति किए गए संवाद का उपयोग करके)।

public class User 
{ 
    [TypeConverter(typeof(PasswordConverter))] 
    [Editor(typeof(PasswordEditor), typeof(UITypeEditor))] 
    public string Password { get; set; } 
} 

public class PasswordConverter : TypeConverter 
{ 
    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) 
    { 
     if (destinationType == typeof(string)) return true; 

     return base.CanConvertTo(context, destinationType); 
    } 

    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) 
    { 
     if (destinationType == typeof(string)) 
     { 
      string password = (string)value; 

      if (password != null && password.Length > 0) 
      { 
       return "********"; 
      } 
     } 

     return base.ConvertTo(context, culture, value, destinationType); 
    } 
} 

public class PasswordEditor : UITypeEditor 
{ 
    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
    { 
     string password = (string)value; 

     // Show a dialog allowing the user to enter a password 

     return password; 
    } 

    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
    { 
     return UITypeEditorEditStyle.Modal; 
    } 
} 
संबंधित मुद्दे