2009-09-17 6 views
5

ComboBox ItemsコレクションはObjectCollectionですので、必要なものを格納することはできますが、ListViewItemと同じようにTextプロパティを取得しないことを意味します。 ComboBoxは、各アイテムのToString()を呼び出すか、DisplayMemberプロパティが設定されている場合はリフレクションを使用してアイテムを表示します。コンボボックスアイテムをインプレイスでどのように更新しますか?

My ComboBoxはDropDownListモードです。私は、ユーザーが選択したときに、リスト内の単一項目の項目テキストを更新したいという状況があります。問題は、ComboBoxが読み込まれたときだけでなく、いつでもテキストを再クエリしないということです。選択したアイテムを削除して再追加する以外に、他にどのようにするかわかりません。


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(); 

このコードは、私のSelectedIndexをイベントが(その後、再び、私はこのコードでプロパティを再設定する場合、一度元のユーザーイベントに、と)二回解雇終わるという事実を除いて、正常に動作します。この場合、イベントは2回発射されることは大したことではありませんが、非効率的で、私はそれが嫌いです。 2回目にイベントを終了するようにフラグを設定できますが、それはハッキングです。

これを機能させるには良い方法がありますか?

答えて

2

ドーナツの提案を参考にしてください。フォームクラスで

private BindingList<PlantComboBoxItem> _plantList;

積載方法で:

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

SelectedIndexChangedイベントで:

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

ありがとうございました!

+0

は、私は疑問に思います。 –

+0

Noooooo ... ResetItem()はSelectedIndexChangedメソッドを起動します:( ああ、これは私の元々の解決策であることがまだまだ清潔です。 –

+0

'ResetItem()'を呼び出す必要がありますか? 'cboPlants'の項目は、ちょうどそれを直接更新する(私は思う?)。'_plantList [selectedIndex]'で 'SelectedIndexChanged'イベントにアクセスできます。 – Donut

4

うん... hereのようにBindingList<T>を使用できますか?そうすれば、基になるコレクションのアイテムを変更し、コントロールに何も追加したり削除したりすることなく、ComboBoxに反映させることができます。

あなたはComboBoxのためにすべてのアイテムを含む、このようなコレクションの何かを持っている必要があるだろう。そして、

private BindingList<PlantComboBoxItem> plantComboBoxItems; 

、(プログラムが起動されたときのように)いくつかの点で、ComboBoxにバインド:

plantComboBoxItems[cboPlants.SelectedIndex].doWhateverYouWant(); 
:今

cboPlants.DataSource = plantComboBoxItems; 

、あなただけの直接のコレクションを変更することができます

変更内容はcboPlantsに反映されます。これはあなたが探しているものですか?

8

汚いハック:誰もがコンボボックスにRefreshItem機能のようなものが含まれると考えられていない理由はさておきとして

typeof(ComboBox).InvokeMember("RefreshItems", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, cboPlants, new object[] { }); 
関連する問題