2015-10-28 21 views
5

Basit bir WinForms uygulaması yapıyorum ve bazı garip bir sorunla karşı karşıyayım.ComboBoxes bağlandı (ve bu kötü)

Benim formu:

enter image description here

O olabilir kadar kolaydır: 3 comboboxes ve iki düğme - Tamam ve iptal.

Görünüm: (o Ok düğmesi tıklandığında sonra olur) benim Comboboxlarda tüm pozisyonunu seçilen değişir yöntemi applyOrderButton_Click() caling sonra ne olur

private void applyOrderButton_Click(object sender, EventArgs e) 
    { 
     List<string> testList = new List<string>() 
     { 
      "A", 
      "B", 
      "C" 
     }; 

     comboBox1st.DataSource = testList; 
     comboBox2nd.DataSource = testList; 
     comboBox3rd.DataSource = testList; 

     comboBox1st.SelectedIndex = 2; 
     comboBox2nd.SelectedIndex = 1; 
     comboBox3rd.SelectedIndex = 0; 
     //Presenter.DoTest(); 
    } 

. Ancak, bu comboBox'ların her biri aynı seçili indekse sahiptir - bu durumda "A" olacaktır.

Daha sonra değişkeni comboBox selectedIndex değiştirerek değiştiririm (örneğin "C" yi göstermek için 3. comboBox'u seçerim). Değişiklikler üç comboBox için gerçekleştirilir. Ne yapıyorum yanlış?

+1

Her üç kutuları, aslında aynı örneği aynı kaynağı paylaşır. Listedeki mevcut konum, sayıcının mevcut öğesi üzerinden kontrol edilir. Bunu değiştirirseniz, her yerde değişir. – Shnugo

cevap

10

"CurrencyManager" adlı WinForms'un arka planında bulunan bir şeye rastlıyorsunuz. İşi, "geçerli kaydı", aynı veri kaynağına başvuran tüm ikili denetimler arasında senkronize etmektir.

Örneğin, bir etiket eklediyseniz ve onu aynı listeye bağladıysanız ve nesnelerden birinin bir özelliğini gösterecek şekilde bağladıysanız, her zaman seçtiğiniz nesnenin özellik değerini gösterirsiniz. combobox'ta.

Nesnelerin bir listesini, metin kutularını ve nesnelere ait özelliklerin özelliklerini düzenleyen ve bir sonraki veya bir önceki satıra gitmenize olanak tanıyan bir gezgini ekleyen bir formu kolayca ekleyebileceğiniz bir eklentidir. . Tüm metin kutularının doğru nesneyi gösterdiğinden emin olmanız gerekmez; CurrencyManager sizin için tüm bunları yapar. Ancak, aynı veri kaynağını üç combobox'a bağladığınızdan, CurrencyManager, üçünün de aynı satırı seçeceğinden emin olabilirsiniz. Birleşik kutulardan birinde yeni bir satır seçerseniz, CurrencyManager gidecek ve tüm diğerlerini aynı satıra yönlendirecektir.

çeşitli şekillerde bu düzeltebilirsiniz: Bu yolu eğer atamadan önce bunu yapmak gerektiğini

comboBox2nd.BindingContext = new BindingContext(); 
comboBox3rd.BindingContext = new BindingContext(); 

Not:

  1. Her combobox için bağlayıcı bağlamı geçersiz kılabilir SelectedIndex veya SelectedItem özellikleri, aksi takdirde CurrencyManager yeni BindingContexts atanmadan önce diğer iki combobox'ı güncelleştirmiş olacak.

  2. Her combobox farklı veri kaynaklarını atayabilirsiniz:

    combobox2nd.DataSource = testList.ToList(); 
    combobox3rd.DataSource = testList.ToList(); 
    
7

Aynen öyle diğer Comboboxlarda yeni bağlamı atamak:

List<string> testList = new List<string>() 
    { 
     "A", 
     "B", 
     "C" 
    }; 

comboBox1st.DataSource = testList; 

comboBox2nd.BindingContext = new BindingContext(); 
comboBox2nd.DataSource = testList; 

comboBox3rd.BindingContext = new BindingContext(); 
comboBox3rd.DataSource = testList; 

comboBox1st.SelectedIndex = 2; 
comboBox2nd.SelectedIndex = 1; 
comboBox3rd.SelectedIndex = 0; 

CurrencyManager birbirlerine (aynı kayıttaki verileri gösteren) ile senkronize veri bağlı kontroller tutmak için kullanılır. CurrencyManager nesnesi, bir veri kaynağı tarafından sağlanan bağlı verilerin bir koleksiyonunu yöneterek bunu yapar. Bir Windows Formu ile ilişkili her veri kaynağı için, form en az bir CurrencyManager tutar. Bir formla ilişkili birden fazla veri kaynağı olabileceğinden, BindingContext nesnesi belirli bir form için tüm CurrencyManager nesnelerini yönetir. Daha geniş olarak, tüm kapsayıcı denetimleri, CurrencyManager'larını yönetmek için en az bir BindingContext nesnesine sahiptir.