Как отменить выбор текста в выпадающем списке - PullRequest
17 голосов
/ 27 октября 2011

У меня есть поле со списком криптона, которое я связываю со списком пар ключ-значение.Происходит следующее: когда я устанавливаю выбранный элемент в коде, он выделяет текст.Как я могу предотвратить это или отменить выделение текста?

Я пробовал следующее:

// 1
combo.Select(0,0);
// 2
combo.Focus();
anotherControl.Focus();
// 3
combo.SelectionStart = 0;
combo.SelectionLength = combo.Text.Length;
// 4 
combo.SelectionStart = combo.Text.Length;
combo.SelectionLength = 0;

Кажется, ничего не работает.Любая помощь приветствуется.

Ответы [ 14 ]

7 голосов
/ 26 февраля 2014

Мне удалось выполнить это, переопределив событие OnPaint моего элемента управления / окна и выполнив

combobox1.SelectionLength = 0;
3 голосов
/ 08 ноября 2012

Возможно, я нашел решение, которое работает:

Если вы используете форму, подпишитесь на событие Shown формы.

OR

Если вы используете UserControl (как и я), вы можете подписаться на событие VisibleChanged.

В этом случае вы можете сделать следующее:

        foreach (ComboBox cbo in (this.Controls.Cast<Control>().Where(c => c is ComboBox).Select(c => (ComboBox) c)))
        {
            cbo.SelectionLength = 0;
        }

В сторону:

Я закончил тем, что сделал это для пользовательского элемента управления, в котором я добавил ComboBox к элементу управления, а затем мне нужно было динамически установить их размер. Установка размера вызвала выделение, с которым столкнулся OP.

2 голосов
/ 27 октября 2011

Попробуйте это

combo.SelectedText = String.Empty;

Относительно вашей проблемы с фокусом: ( MSDN )

Когда поле со списком теряет фокус, точка выбора перемещаетсяв начале текста и любой выделенный текст становится невыбранным

Так странно;почему не работает следующее:

anotherControl.Focus(); 
1 голос
/ 29 апреля 2017

По событию SelectedIndexChanged добавьте таймер, который будет выполняться только один раз через 10 миллисекунд.

new System.Threading.Timer((s) =>
            {
                comboBox1.Invoke(new Action(() =>
                {
                    comboBox1.Select(0, 0);
                }));
            }, null, 10, System.Threading.Timeout.Infinite);
1 голос
/ 16 февраля 2015

Вы просто должны поместить этот код в сгенерированное событие или нажатие кнопки, где вы хотите отменить выбор текста поля со списком

ComboBox1.SelectedItem = null;
0 голосов
/ 29 января 2019

«Выбрать» не работает для меня.Но я нашел очень простой трюк.Добавьте это право в SelectedIndexChanged-Event:

comboBox1.Hide();
comboBox1.Show();

У меня работает.

0 голосов
/ 28 августа 2018

Подписаться на событие «SelectedIndexChanged», задача которого - установить фокус ComboBox.

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    comboBox1.Focus();
}

Подписаться на событие «Краска» из основной формы. Отмена выбора происходит в этом обработчике события:

private void MainForm_Paint(object sender, PaintEventArgs e)
{
    comboBox1.SelectionLength = 0;
}
0 голосов
/ 26 сентября 2016

В моем случае выбор появился после изменения размера. Это решило это:

textBox.Resize += (sender, args) =>
{
    Control c = sender as Control;
    if (c == null || c.Parent == null)
        return;

    c.Focus();
    c.Parent.Focus();
};
0 голосов
/ 28 июня 2016

Мне все равно, сколько лет. Мы создаем базу знаний.

Я использую D5 (и, вероятно, предыдущие версии совпадают). Вам необходимо использовать:

Combobox.SelLength :=  0; 

Кроме того, если это не сработает, это: Избегайте стиля по умолчанию (csDropDown). И установите его на:

Combobox.Style := csDropDownList; 

как предположил Алекс.

Спасибо. Работает отлично!

0 голосов
/ 23 октября 2014

мне помогли эти 3 строки:

cbInstallationType.SelectionStart = 0;
cbInstallationType.SelectionLength = 0;
cbInstallationType.TabIndex = 99;

TabIndex должен быть не первым, чтобы он не был первым элементом в форме

...