2009-04-08 12 views
6

WinForms, .NetFramework 3.5नियंत्रण की दृश्यमान संपत्ति के लिए डेटाफिंड विनफॉर्म

क्या नियंत्रण की दृश्य संपत्ति पर डेटाबेसिंग करते समय कोई ज्ञात समस्याएं हैं?

नियंत्रण मेरी संपत्ति के बावजूद हमेशा दिखाई नहीं देता है।

Public ReadOnly Property IsRibbonCategory() As Boolean 
    Get 
     Return True 
    End Get 
End Property 

मैंने नियंत्रण की टेक्स्ट प्रॉपर्टी और अन्य गुणों की कोशिश की और वे सही तरीके से काम करने लगते हैं।

मैं एक पैनल की दृश्यमान संपत्ति सेट करने की कोशिश कर रहा हूं।

बाइंडिंग स्रोत का उपयोग करना।

अग्रिम में Thx।

+0

कैसे आप बाध्यकारी हैं? एक बाइंडिंगसोर्स नियंत्रण या घोषणात्मक के साथ? –

+0

@matt - bindingsource –

+0

इस के साथ ऐसा करने के लिए कुछ हो सकता है: http://stackoverflow.com/a/2570153/2455604 – Marwie

उत्तर

3

वर्कअराउंड: बाइंडिंग कॉम्पलेट ईवेंट पर दृश्यमान संपत्ति सेट करें।

मुझे एक लेबल की दृश्यमान संपत्ति सेट करने में एक ही समस्या थी - हमेशा सक्षम संपत्ति को सेट करने के बावजूद झूठी रहती है।

1

हालात की जाँच करने के:

  • सुनिश्चित करें कि आप कक्षा वर्ग के उदाहरण के लिए IsRibbonCategory संपत्ति
  • आप बाध्यकारी स्रोत की संपत्ति के डेटा स्रोत सेट किया है कि instantiated किए जा रहे
  • डेटासोर्स अपडेट मोड "सत्यापन पर"
  • सुनिश्चित करें कि आपने दृश्यमान संपत्ति को मैन्युअल रूप से नियंत्रण पर सेट नहीं किया है

उम्मीद है कि मदद करता है। क्या आप अधिक कोड पोस्ट कर सकते हैं?

+0

मैंने उन सभी की जांच की है, लेकिन कोई पासा नहीं है। एक सवाल, क्या आपने दृश्यमान संपत्ति के लिए डाटाबेसिंग करने की कोशिश की है और यह काम करता है? –

+0

हां। वीएस 2008/विनफॉर्म। बाइंडिंगसोर्स नियंत्रण के डेटासोर्स को सेट करने के लिए आप किस घटना का उपयोग करते हैं? –

+0

फॉर्म का कन्स्ट्रक्टर। –

8

मुझे पता चला है कि यदि आप मानते हैं कि नियंत्रण किसी दृश्य की संपत्ति के लिए बाध्यकारी है तो यह जीवन बेहतर होता है, इस तथ्य के बावजूद कि यह कभी-कभी काम करता है। http://support.microsoft.com/kb/327305 देखें, जो कि बहुत कुछ कहता है (और जबकि KB आलेख .NET 1.0 और 1.1 पर लागू होता है, फिर भी यह कम से कम 2.0 में एक समस्या प्रतीत होता है)।

मैंने बाइंडिंग बनाने के लिए एक उपयोगिता वर्ग बनाया, जिसमें अन्य चीजों के अलावा, मुझे एक कार्यस्थल जोड़ने के लिए एक केंद्रीकृत स्थान दिया। इसके बजाय वास्तव में दर्शनीय पर बाध्यकारी एक बनाने की यह दो बातें करता है:

  1. यह डेटा स्रोत के INotifyPropertyChanged.PropertyChanged घटना का सदस्य बनता और उचित रूप में दिखाई देता मूल्य सेट किए जाने पर घटना के लिए उठाया है।
  2. यह वर्तमान डेटा स्रोत मान के अनुसार दृश्यमान का प्रारंभिक मान सेट करता है।

इसके लिए थोड़ा प्रतिबिंब कोड आवश्यक था, लेकिन यह बहुत बुरा नहीं था। यह महत्वपूर्ण है कि आप दृश्यमान संपत्ति और को कार्य-आसपास न करें या यह काम नहीं करेगा।

+6

+1 के साथ एक छोटा प्रोटोटाइप लगाने की कोशिश करूंगा, और स्पष्ट रूप से यह अभी भी .NET 4 के लिए सच है। –

0

का संभावित हल सीधे नियंत्रण की दृश्यता संपत्ति के लिए बाध्य करने के बजाय एक नियंत्रण के दृश्यता संपत्ति को DataBind करने के लिए एक घटक का उपयोग करने के लिए होगा। कोड नीचे देखें:

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 

namespace WindowsFormsApplication2 
{ 
    public class ControlVisibilityBinding : Component 
    { 
    private static readonly object EventControlChanged = new object(); 
    private static readonly object EventVisibleChanged = new object(); 

    private System.Windows.Forms.Control _control; 
    private bool _visible = true; 

    public event EventHandler VisibleChanged 
    { 
     add { Events.AddHandler(EventVisibleChanged, value); } 
     remove { Events.RemoveHandler(EventVisibleChanged, value); } 
    } 

    public event EventHandler ControlChanged 
    { 
     add { Events.AddHandler(EventControlChanged, value); } 
     remove { Events.RemoveHandler(EventControlChanged, value); } 
    } 

    public ControlVisibilityBinding() 
    { 
    } 

    public ControlVisibilityBinding(IContainer container) 
    { 
     container.Add(this); 
    } 

    [DefaultValue(null)] 
    public System.Windows.Forms.Control Control 
    { 
     get { return _control; } 
     set 
     { 
      if(_control == value) 
      { 
       return; 
      } 
      WireControl(_control, false); 
      _control = value; 
      if(_control != null) 
      { 
       _control.Visible = _visible; 
      } 
      WireControl(_control, true); 
      OnControlChanged(EventArgs.Empty); 
      OnVisibleChanged(EventArgs.Empty); 
     } 
    } 

    [DefaultValue(true)] 
    public bool Visible 
    { 
     get { return _visible; } 
     set 
     { 
      if(_visible != value) 
      { 
       _visible = value; 
      } 
      if(Control != null) 
      { 
       Control.Visible = _visible; 
      } 
      OnVisibleChanged(EventArgs.Empty); 
     } 
    } 

    private void WireControl(Control control, bool subscribe) 
    { 
     if(control == null) 
     { 
      return; 
     } 
     if(subscribe) 
     { 
      control.VisibleChanged += Control_VisibleChanged; 
     } 
     else 
     { 
      control.VisibleChanged -= Control_VisibleChanged; 
     } 
    } 

    private void Control_VisibleChanged(object sender, EventArgs e) 
    { 
     OnVisibleChanged(EventArgs.Empty); 
    } 

    protected virtual void OnVisibleChanged(EventArgs e) 
    { 
     EventHandler subscribers = (EventHandler)Events[EventVisibleChanged]; 
     if(subscribers != null) 
     { 
      subscribers(this, e); 
     } 
    } 

    protected virtual void OnControlChanged(EventArgs e) 
    { 
     EventHandler subscribers = (EventHandler)Events[EventControlChanged]; 
     if(subscribers != null) 
     { 
      subscribers(this, e); 
     } 
    } 
} 

static class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     using(Form form = new Form()) 
     using(FlowLayoutPanel groupBoxLayoutPanel = new FlowLayoutPanel()) 
     using(RadioButton visibleButton = new RadioButton()) 
     using(RadioButton hiddenButton = new RadioButton()) 
     using(GroupBox groupBox = new GroupBox()) 
     using(Label text = new Label()) 
     using(ControlVisibilityBinding visibilityBinding = new ControlVisibilityBinding()) 
     using(TextBox inputTextBox = new TextBox()) 
     { 
      groupBoxLayoutPanel.Dock = DockStyle.Fill; 
      groupBoxLayoutPanel.FlowDirection = FlowDirection.LeftToRight; 
      groupBoxLayoutPanel.AutoSize = true; 
      groupBoxLayoutPanel.AutoSizeMode = AutoSizeMode.GrowAndShrink; 

      visibleButton.Text = "Show Label"; 
      visibleButton.AutoSize = true; 
      hiddenButton.Text = "Hide Label"; 
      hiddenButton.AutoSize = true; 
      groupBoxLayoutPanel.Controls.Add(visibleButton); 
      groupBoxLayoutPanel.Controls.Add(hiddenButton); 

      inputTextBox.Text = "Enter Label Text Here"; 
      inputTextBox.Dock = DockStyle.Top; 

      groupBox.AutoSize = true; 
      groupBox.AutoSizeMode = AutoSizeMode.GrowAndShrink; 
      groupBox.Controls.Add(groupBoxLayoutPanel); 
      groupBox.Dock = DockStyle.Fill; 

      text.AutoSize = true; 
      text.ForeColor = Color.Red; 
      text.Dock = DockStyle.Bottom; 
      text.BorderStyle = BorderStyle.FixedSingle; 
      text.Font = new Font(text.Font.FontFamily, text.Font.Size * 1.25f, FontStyle.Bold | FontStyle.Italic); 
      text.DataBindings.Add("Text", inputTextBox, "Text", true, DataSourceUpdateMode.Never); 

      visibilityBinding.Control = text; 
      visibleButton.DataBindings.Add("Checked", visibilityBinding, "Visible", true, DataSourceUpdateMode.OnPropertyChanged); 
      Binding binding = hiddenButton.DataBindings.Add("Checked", visibilityBinding, "Visible", true, DataSourceUpdateMode.OnPropertyChanged); 
      ConvertEventHandler invertConverter = (sender, e) => e.Value = !((bool)e.Value); 
      binding.Format += invertConverter; 
      binding.Parse += invertConverter; 

      form.Controls.Add(inputTextBox); 
      form.Controls.Add(text); 
      form.Controls.Add(groupBox); 
      Application.Run(form); 
     } 
    } 
} 

}

संबंधित मुद्दे