コード例:
private void comboBox_SelectedIndexChanged(object sender, EventArgs e)
{
if(some condition)
{
comboBox.Text = "new string"
}
}
私の問題は、comboBox テキストが、新しい文字列ではなく、選択したインデックスの文字列値を常に表示することです。これを回避する方法はありますか?
コード例:
private void comboBox_SelectedIndexChanged(object sender, EventArgs e)
{
if(some condition)
{
comboBox.Text = "new string"
}
}
私の問題は、comboBox テキストが、新しい文字列ではなく、選択したインデックスの文字列値を常に表示することです。これを回避する方法はありますか?
SelectedIndex
プロパティを設定するときは、プロパティを -1 にリセットする必要がありText
ます。
変更コードをコンボボックス イベントの外に移動します。
if(some condition)
{
BeginInvoke(new Action(() => comboBox.Text = "new string"));
}
// 100% 働いた
private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
BeginInvoke(new Action(() => ComboBox1.Text = "Cool!");
}
何をしようとしているのかを正確に説明していただけると助かるかもしれません。あなたが説明したような目的では、SelectedIndexChanged よりも SelectionChangeCommitted イベントの方がはるかに役立つことがわかりました。特に、SelectionChangeCommitted から選択したインデックスを再度変更することができます (たとえば、ユーザーの選択が無効な場合)。また、コードからインデックスを変更すると、SelectedIndexChanged が再び起動されますが、SelectionChangeCommitted はユーザー アクションに応答してのみ起動されます。
つまり、.NET は発生する可能性のある無限ループを防止しようとしています。Text プロパティが変更されると、.NET はその新しい値を現在の項目に一致させ、インデックスを変更しようとするため、SelectedIndexChanged イベントが再び発生します。
Delegates の VB 実装を探している人は、以下のコードを参照できます。
'Declares a delegate sub that takes no parameters
Delegate Sub ComboDelegate()
'Loads form and controls
Private Sub LoadForm(sender As System.Object, e As System.EventArgs) _
Handles MyBase.Load
ComboBox1.Items.Add("This is okay")
ComboBox1.Items.Add("This is NOT okay")
ResetComboBox()
End Sub
'Handles Selected Index Changed Event for combo Box
Private Sub ComboBoxSelectionChanged(sender As System.Object, e As System.EventArgs) _
Handles ComboBox1.SelectedIndexChanged
'if option 2 selected, reset control back to original
If ComboBox1.SelectedIndex = 1 Then
BeginInvoke(New ComboDelegate(AddressOf ResetComboBox))
End If
End Sub
'Exits out of ComboBox selection and displays prompt text
Private Sub ResetComboBox()
With ComboBox1
.SelectedIndex = -1
.Text = "Select an option"
.Focus()
End With
End Sub
参考資料 :イベントでCombobox Text を変更するSelectedIndexChanged
方法については、この投稿 (私の記事) を参照してください。ComboBox Textを変更する回避策としてデリゲートを使用する必要がある理由について、もう少し詳しく説明しています。
ComboBox は、単に DropDownLists で見つけたテキストと値の組み合わせを持つのではなく、指定したオブジェクト コレクションにバインドします。
必要なことは、ComboBox の Items コレクションに移動し、更新するアイテムを見つけ、ComboBox 自体の Text フィールドにバインドされているプロパティを更新することです。その後、データバインディングは新しいアイテムで自動的に更新されます。 .
ただし、バインドされている基になるデータ オブジェクトを実際に変更する必要があるかどうかは 100% 確信が持てないため、代わりに ComboBox にバインドするための参照として HashTable またはその他のコレクションを作成することをお勧めします。
あなたが使用する必要があります:
BeginInvoke(new Action((text) =>omboBox.Text = text), "設定する新しいテキスト");