Как изменить comboBox.Text внутри события comboBox.SelectedIndexChanged? - PullRequest
3 голосов
/ 26 июня 2009

Пример кода:

private void comboBox_SelectedIndexChanged(object sender, EventArgs e)
{
    if(some condition)
    {
        comboBox.Text = "new string"
    }
}

Моя проблема в том, что текст comboBox всегда показывает значение строки выбранного индекса, а не новую строку. Есть ли способ обойти это?

Ответы [ 9 ]

14 голосов
/ 27 июня 2009

Этот код должен работать ...

public Form1()
{
    InitializeComponent();

    comboBox1.Items.AddRange(new String[] { "Item1", "Item2", "Item3" });
}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    String text = "You selected: " + comboBox1.Text;

    BeginInvoke(new Action(() => comboBox1.Text = text));
}

Надеюсь, это поможет ... :)

2 голосов
/ 26 июня 2009

Переместите ваш код изменения за пределы события выпадающего списка:

if(some condition)
{
    BeginInvoke(new Action(() => comboBox.Text = "new string"));
}
2 голосов
/ 26 июня 2009

При установке свойства Text необходимо сбросить свойство SelectedIndex на -1.

1 голос
/ 26 июня 2009

Возможно, было бы полезно, если бы вы могли точно объяснить, что вы пытаетесь сделать. Я считаю, что событие SelectionChangeCommitted значительно более полезно для целей, подобных описанным вами, чем SelectedIndexChanged. Среди прочего, возможно снова изменить выбранный индекс из SelectionChangeCommitted (например, если выбор пользователя недействителен). Кроме того, изменение индекса из кода вызывает SelectedIndexChanged снова, тогда как SelectionChangeCommitted запускается только в ответ на действия пользователя.

0 голосов
/ 25 августа 2015

Я искал решение для той же проблемы. Но решите это, обработав событие Format:

cbWatchPath.Format += new System.Windows.Forms.ListControlConvertEventHandler(this.cbWatchPath_Format);

private void cbWatchPath_Format(object sender, ListControlConvertEventArgs e)
    {
        e.Value = "Your text here";
    }
0 голосов
/ 01 ноября 2013

// 100% сработало

private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
      BeginInvoke(new Action(() => ComboBox1.Text = "Cool!");
}
0 голосов
/ 24 февраля 2013

Несмотря на то, что он находится в VB, этот пост на Изменение текста в поле со списком в SelectedIndexChanged Событии расскажет немного подробнее о том, почему вам нужно использовать делегата в качестве обходного пути для изменения текста ComoboBox. Короче говоря, .NET пытается предотвратить бесконечный цикл, который может произойти, потому что когда происходит изменение свойства Text, .NET будет пытаться сопоставить это новое значение с текущими элементами и изменить индекс для вас, тем самым вызывая событие SelectedIndexChanged еще раз.

Люди, приезжающие сюда в поисках реализации Делегатов на 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
0 голосов
/ 14 февраля 2013

вы должны использовать:

BeginInvoke (новое действие ((текст) => comboBox.Text = текст), «новый текст для установки»);

0 голосов
/ 26 июня 2009

ComboBox будет привязываться к любой коллекции объектов, которую вы укажете, в отличие от простого сочетания текста / значения, которое вы найдете в DropDownLists.

Что вам нужно сделать, так это перейти в коллекцию ComboBox's Items, найти элемент, который вы хотите обновить, обновить любое свойство, которое вы привязали к текстовому полю в самом ComboBox, и тогда привязка данных должна автоматически обновиться с помощью новый предмет.

Однако я не уверен на 100%, что вы действительно хотите изменить привязываемый базовый объект данных, поэтому вы можете захотеть создать HashTable или другую коллекцию в качестве ссылки для привязки к вашему ComboBox.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...