2009-06-03 18 views
6

Bu, asp.net değil, winforms ile bir .net sorundur.Veri bağlama görünmez kontrolde çalışır mı?

Birkaç sekmeli bir pencere formum var. Form yüklendiğinde tüm denetimlerin veri bağlamalarını ayarlıyorum. Ancak, ikinci sekmedeki kontrollerin veri bağlarının çalışmadığını fark ettim. Bu bağlamalar, yalnızca form yüklendiğinde ve ikinci sekmeyi seçtiğimde çalışır. Bu şüpheyi bana getiriyor: veri bağlamaları yalnızca bağlı denetimler görünür hale geldiğinde çalışır.

Bunun doğru olup olmadığını herkes söyleyebilir mi? Bunu test etmek zor değil ama bazı onayları bilmek istiyorum.

Teşekkürler

cevap

8

Siz haklısınız. Veriye bağlı kontrol, kontrol görünür hale gelinceye kadar güncellenmez.

Şu anda bu sitede bulabildiğim tek referans this MSDN thread.

+0

Vay. Veri kaynağı üzerinden veri için her zaman gittim sanırım - Gerçekten kontroller görünür olduğunda bağlamaları gerçekten çalışıyordu hiçbir fikrim yoktu. – overslacked

+1

Aynı sorunu yaşadım, bkz. Http://stackoverflow.com/questions/9828153 –

+0

Şahsen bunun bir özelliği olduğunu düşünüyorum. – nawfal

0

Bu, doğrudan rastladığım bir şey değil. Ancak, BindingContext ile ilgili bir sorun yaşıyor olabilirsiniz. Daha fazla ayrıntı olmadan söylemek zor, ama ben olsaydım bir kesme noktası belirledim ve kontrollerin hepsinin aynı bağlamda olmasını sağladım.

4

Sorununuz TabControl'ün davranışı ile ilgilidir. Bakınız Microsoft bug report. Denetim oluşturulduğunda veya tanıtıcı oluşturulduğunda TabControl ve 'Sekmeleri tüm sekme sayfalarının alt sınıflarını içeren bu sorun için bir geçici çözüm gönderdim. Aşağıda, geçici çözümün kodu verilmiştir.

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

Tam olarak "IntPtr tanıtıcı = sayfa_.Handle", burada değerin kullanılmadığı göz önüne alındığında ne yapıyor? – Michael

+0

Oluşturulacak tanıtıcıya zorla –

+0

Teşekkürler. Bunun böyle bir şey olduğunu düşündüm.Bunu denedim, btw, ama benim için çalışmadı. IsHandleCreated ve Created hala sahte iken kontrollerim ekleniyordu. Bu durumda bir düzeltme yapılacağını sanıyorum, ama farklı bir rota aldım: Tüm bağlantıları yaptıktan sonra, tüm görünür kontrolleri bulup görünebilir olanlara VisibleChanged işleyicisi ekliyorum, ki bunlar görünür hale geldiklerinde ihtiyacım olan şeyi yapacak. – Michael

0

Benzer bir sorunla karşılaştık. Veri kümemize yazdığımız formatı değiştirebilmemiz için 2 ciltli, görünmez alana yazmaya çalışıyoruz. Bu, nesneler görünür olduğunda çalışır, ancak görünür özellik yanlış olarak değiştirildiği zaman çalışmayı durdurur. Bununla mücadele ettik kendim

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

ve subclassing yanında tek geçici çözüm, görünüşe (hjb417 cevabını bakın) sonucuna, diğer yapmaktı:

Bu bilgilere için ben aşağıdaki kodu eklendi sekme görünür. Diğer sekmeye geçmek ve formun görünmeden hemen önceki önceki durumuna dönülmez. İkinci sekme görünür olmasını istemiyorsanız, ben geçici bir çözüm olarak aşağıdaki kodu kullandım:

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

görünür sekmesi tabPageA varsayarsak ve tabPageB istediğiniz görünmez biridir başlatılamadı. Bu, B sayfasına geçer ve veri bağlaması tamamlandığında geri döner. Bu, formdaki kullanıcı için görünmez.

Hala çirkin bir kesmek, ama en azından bu çalışır. Tabii ki, birden fazla sekme olduğunda o kod bile çirkinleşir.