2009-09-17 18 views
5

ComboBox Öğeleri koleksiyonu bir ObjectCollection öğesidir, bu nedenle, orada istediğiniz her şeyi saklayabilirsiniz, ancak bu, ListViewItem ile yaptığınız gibi bir Text özelliğini alamadığınız anlamına gelir. ComboBox öğeleri, her öğede ToString() öğesini çağırarak veya DisplayMember özelliği ayarlanmışsa yansıma kullanarak görüntüler.Bir açılan kutu öğesini yerinde nasıl yeniliyorsunuz?

Benim ComboBox'ım DropDownList modunda. Kullanıcı tarafından seçildiğinde listedeki tek bir öğenin öğe metnini yenilemek istediğim bir durum var. Sorun, ComboBox'ın, yüklendiğinde yanında herhangi bir zamanda yeniden sorgulamadığı ve seçilen öğeyi kaldırmak ve yeniden eklemenin yanı sıra ne istediğimi başka bir şekilde yapamayacağımı anlayamıyorum:


PlantComboBoxItem selectedItem = cboPlants.SelectedItem as PlantComboBoxItem; 

// ... 

cboPlants.BeginUpdate(); 

int selectedIndex = cboPlants.SelectedIndex; 
cboPlants.Items.RemoveAt(selectedIndex); 
cboPlants.Items.Insert(selectedIndex, selectedItem); 
cboPlants.SelectedIndex = selectedIndex; 

cboPlants.EndUpdate(); 

Bu kod benim Selectedındex olay (yeniden bu kodda özelliği erme zaman bir kez özgün kullanıcı olayı ve) iki kez kovulmak biter gerçeği dışında, gayet iyi çalışıyor. Bu durumda, olayın iki kez ateşlenmesi önemli değil, ama verimsiz ve bundan nefret ediyorum. Bir bayrağı hazırlayabilirdim, böylece olay ikinci kez çıkar, ama bu hackleme.

Bunu işe almak için daha iyi bir yolu var mı?

cevap

2

Bunu aldım, Donut'un önerisini kullanarak. Form sınıfta

:

private BindingList<PlantComboBoxItem> _plantList;

yükleme yönteminde:

_plantList = new BindingList<PlantComboBoxItem>(plantItems); 
cboPlants.DataSource = _plantList;

Selectedındexchanged durumunda:

int selectedIndex = cboPlants.SelectedIndex; 
_plantList.ResetItem(selectedIndex);

teşekkür ederiz!

+0

, merak ediyorum. –

+0

Noooooo ... ResetItem() SelectedIndexChanged yöntemini tetikler :( Oh iyi, bu hala orijinal çözümümün daha temiz olduğunu. –

+0

'ResetItem()' işlevini çağırmanız gerekiyor mu? Eğer 'cboPlants' içindeki öğe değiştirilmeli sadece doğrudan güncellemek (Bence?).'SelectedIndexChanged' etkinliğinde '_plantList [selectedIndex]' ile erişebilirsiniz. – Donut

4

Hmm ... here açıklandığı gibi BindingList<T> kullanıyor musunuz? Bu şekilde, öğeyi temeldeki koleksiyonda değiştirebilir ve denetimden herhangi bir şey eklemek veya kaldırmak zorunda kalmadan ComboBox'a yansıtmanız gerekebilir.

Sen ComboBox için tüm öğeleri içeren, böyle bir koleksiyon şey var gerekir: birleştirmiş ComboBox için, (program ne zaman başlayacağını gibi) bir noktada

private BindingList<PlantComboBoxItem> plantComboBoxItems; 

Ardından :

plantComboBoxItems[cboPlants.SelectedIndex].doWhateverYouWant(); 
: Artık

cboPlants.DataSource = plantComboBoxItems; 

, sadece doğrudan koleksiyonu değiştirebilir

Ve değişiklikler cboPlants'da yansıtılacaktır. Aradığın şey bu mu?

8

Kirli kesmek: düşünce kimse ComboBox bir RefreshItem fonksiyonu gibi şeyler eklemeyi neden bir kenara olarak

typeof(ComboBox).InvokeMember("RefreshItems", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, cboPlants, new object[] { }); 
İlgili konular