2009-06-03 19 views
6

यह Winforms के साथ एक .NET समस्या है, asp.net नहीं।क्या अदृश्य नियंत्रण पर डेटा बाध्यकारी काम करता है?

मेरे पास कई टैब के साथ एक विंडोज़ फॉर्म है। जब फॉर्म लोड होता है तो मैं सभी नियंत्रणों के डेटा बाइंडिंग सेट करता हूं। लेकिन मैंने देखा है कि दूसरे टैब पर नियंत्रण की डेटा बाइंडिंग काम नहीं करती है। वे बाइंडिंग केवल तभी काम करते हैं जब फॉर्म लोड होता है और जब मैं दूसरा टैब चुनता हूं। यह मुझे संदेह लाता है: डेटा बाइंडिंग केवल तभी काम करते हैं जब बाध्य नियंत्रण दिखाई दे।

कोई भी मुझे बता सकता है कि यह सच है या नहीं? इसका परीक्षण करना मुश्किल नहीं है लेकिन मैं कुछ पुष्टि जानना चाहता हूं।

धन्यवाद

उत्तर

8

आप सही हैं। एक डेटा-बाध्य नियंत्रण तब तक अद्यतन नहीं होता है जब तक नियंत्रण दिखाई नहीं देता है।

इस समय के लिए मैं केवल एक ही संदर्भ पा सकता हूं this MSDN thread है।

+0

वाह। मुझे लगता है कि मैं हमेशा डेटासोर्स के माध्यम से डेटा के लिए गया हूं - मुझे वास्तव में कोई जानकारी नहीं थी कि नियंत्रण केवल तब दिखाई दे रहा था जब नियंत्रण दिखाई दे रहा था। – overslacked

+1

मुझे एक ही समस्या थी, http://stackoverflow.com/questions/9828153 –

+0

व्यक्तिगत रूप से मैं इसे एक विशेषता मानता हूं। – nawfal

0

यह ऐसा कुछ नहीं है जो मैं सीधे आया हूं। हालांकि, आपको BindingContext के साथ समस्या का सामना करना पड़ रहा है। अधिक जानकारी के बिना कहना मुश्किल है, लेकिन अगर मैं आप थे तो मैं ब्रेकपॉइंट सेट कर दूंगा और सुनिश्चित करूँगा कि नियंत्रण सभी एक ही संदर्भ में बंधे हैं।

4

आपकी समस्या को TabControl के व्यवहार से करना है। Microsoft bug report देखें। मैंने उस समस्या के लिए एक वर्कअराउंड पोस्ट किया है जो नियंत्रण बनाते हैं या हैंडल बनाया जाता है जब टैबकंट्रोल को उप-वर्गीकृत करता है और सभी टैब पृष्ठों को 'इनटाटाइज' करता है। नीचे कामकाज के लिए कोड है।

public partial class TabControl : System.Windows.Forms.TabControl 
{ 
    protected override void OnHandleCreated(EventArgs e_) 
    { 
     base.OnHandleCreated(e_); 
     foreach (System.Windows.Forms.TabPage tabPage in TabPages) 
     { 
      InitializeTabPage(tabPage, true, Created); 
     } 
    } 

    protected override void OnControlAdded(ControlEventArgs e_) 
    { 
     base.OnControlAdded(e_); 
     System.Windows.Forms.TabPage page = e_.Control as System.Windows.Forms.TabPage; 
     if ((page != null) && (page.Parent == this) && (IsHandleCreated || Created)) 
     { 
      InitializeTabPage(page, IsHandleCreated, Created); 
     } 
    } 

    protected override void OnCreateControl() 
    { 
     base.OnCreateControl(); 
     foreach (System.Windows.Forms.TabPage tabPage in TabPages) 
     { 
      InitializeTabPage(tabPage, IsHandleCreated, true); 
     } 
    } 

    //PRB: Exception thrown during Windows Forms data binding if bound control is on a tab page with uncreated handle 
    //FIX: Make sure all tab pages are created when the tabcontrol is created. 
    //https://connect.microsoft.com/VisualStudio/feedback/details/351177 
    private void InitializeTabPage(System.Windows.Forms.TabPage page_, bool createHandle_, bool createControl_) 
    { 
     if (!createControl_ && !createHandle_) 
     { 
      return; 
     } 
     if (createHandle_ && !page_.IsHandleCreated) 
     { 
      IntPtr handle = page_.Handle; 
     } 
     if (!page_.Created && createControl_) 
     { 
      return; 
     } 
     bool visible = page_.Visible; 
     if (!visible) 
     { 
      page_.Visible = true; 
     } 
     page_.CreateControl(); 
     if (!visible) 
     { 
      page_.Visible = false; 
     } 
    } 
} 
+0

मूल्य का उपयोग नहीं किया जाता है, इस पर विचार करते हुए, "IntPtr हैंडल = page_.Handle" वास्तव में क्या है? – Michael

+0

यह हैंडल को बनाने के लिए मजबूर करता है –

+0

धन्यवाद। मुझे लगा कि यह ऐसा कुछ था।मैंने कोशिश की, बीटीडब्ल्यू, लेकिन यह मेरे लिए काम नहीं किया। मेरे नियंत्रण जोड़े जा रहे थे जबकि IsHandleCreated और बनाया गया अभी भी झूठा था। मुझे लगता है कि कुछ tweaking उस मामले को कवर करेगा, लेकिन मैंने एक अलग रास्ता लिया: सभी बाध्यकारी करने के बाद मुझे सभी बाध्य नियंत्रण मिलते हैं और अदृश्य लोगों को एक दृश्यमान चेंज हैंडलर जोड़ते हैं, जो तब दिखाई देगा जब मुझे दिखाई देगी। – Michael

0

हमें एक ही समस्या का सामना करना पड़ा है। हम 2 बाध्य, अदृश्य फ़ील्ड को लिखने की कोशिश कर रहे हैं ताकि हम अपने डेटासेट में जो प्रारूप लिखते हैं उसे बदल सकें। ऑब्जेक्ट दिखाई देने पर यह ठीक काम करता है, लेकिन दृश्यमान संपत्ति को गलत में बदल दिया गया था, लेकिन काम करना बंद कर देता है। मैं इस के साथ संघर्ष किया गया है अपने आप को

  // Stop our screen flickering. 
     chSplitContainer.Panel2.SuspendLayout(); 
     // Make the bound fields visible or the binding doesn't work. 
     tbxValueCr.Visible = true; 
     tbxValueDb.Visible = true; 

     // Update the fields here. 
     <DO STUFF> 

     // Restore settings to how they were, so you don't know we're here. 
     tbxValueCr.Visible = false; 
     tbxValueDb.Visible = false; 
     chSplitContainer.Panel2.ResumeLayout(); 
1

और निष्कर्ष निकाला कि केवल वैकल्पिक हल, उपवर्गीकरण अलावा जाहिरा तौर पर (hjb417 के जवाब देखें), अन्य बनाने के लिए किया गया था:

यह दौर पाने के लिए, मैं निम्नलिखित कोड जोड़ा टैब दृश्यमान दूसरे टैब पर स्विच करना और फॉर्म दिखाई देने से पहले पिछले पर वापस जाना काम नहीं करता है। आप दूसरे टैब दिखाई नहीं करना चाहते हैं, तो मैं एक समाधान के रूप में निम्नलिखित कोड का उपयोग किया है:

this.tabControl.SelectedTab = this.tabPageB; 
this.tabPageB.BindingContextChanged += (object sender, EventArgs e) => { 
    this.tabContainerMain.SelectedTab = this.tabPageA; 
}; 

tabPageA मान लिया जाये कि दिखाई टैब है, और tabPageB अदृश्य एक आप करना चाहते हैं आरंभ कर देगा। यह पृष्ठ बी पर स्विच करता है, और डेटा बाध्यकारी पूर्ण होने के बाद वापस स्विच करता है। यह फ़ॉर्म में उपयोगकर्ता के लिए अदृश्य है।

अभी भी एक बदसूरत हैक, लेकिन कम से कम यह काम करता है। बेशक, जब आपके पास एकाधिक टैब होते हैं तो कोड भी उलझन में पड़ता है।

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