Как отменить выделение текста в поле со списком

#c# #.net #winforms #combobox #krypton-toolkit

#c# #.net #winforms #поле со списком #криптон-инструментарий

Вопрос:

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

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

 // 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;
  

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

Ответ №1:

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

 combobox1.SelectionLength = 0;
  

Комментарии:

1. Делая это, я не могу выделить текст позже. Его выбор отменяется каждый раз, потому что метод OnPaint вызывается часто

Ответ №2:

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

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

или

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

В этом случае вы можете выполнить следующие действия:

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

В качестве отступа:

В итоге мне пришлось сделать это для пользовательского элемента управления, в который я добавил выпадающие списки к элементу управления, а затем нужно было позже динамически устанавливать их размер. Установка размера вызвала выделение, с которым столкнулась операция.

Ответ №3:

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

 ComboBox1.SelectedItem = null;
  

Комментарии:

1. OP не пытается изменить выбранный элемент, он просто хочет отменить выделение текста.

Ответ №4:

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

 combo.SelectedText = String.Empty;
  

Что касается вашей проблемы с фокусом: (MSDN)

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

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

 anotherControl.Focus(); 
  

Комментарии:

1. странно, когда я нажимаю на него после его загрузки, а затем нажимаю на что-то еще, тогда эта фокусировка работает ! ??! это сводит меня с ума

2. привязан ли ваш выпадающий список к какому-либо источнику данных? Если да, попробуйте SelectedIndex = -1

3. он привязан, но затем я выбираю элемент из списка. По сути, это форма, которая предварительно заполняется из базы данных, поэтому мне нужно выбрать правильный элемент.

Ответ №5:

Я знаю, древний пост, древняя технология, но этот уродливый oneliner работал для меня:

 cb.SelectedValueChanged  = (s, e) => { cb.BeginInvoke((MethodInvoker)delegate { cb.SelectionStart = cb.Text.Length; }); };
  

Ответ №6:

Я знаю, что прошло некоторое время с тех пор, как вы задали этот вопрос. Но вот что вы можете сделать

 combo.selectedindex = -1;
  

Комментарии:

1. Спасибо, но я не пытаюсь изменить выбранный элемент, я просто хочу отменить выделение текста.

Ответ №7:

Вы не указали, должен ли пользователь иметь возможность редактировать значения в поле со списком или нет. Если нет, то DropDownStyle для выпадающего списка должно быть установлено значение ComboBoxStyle.DropDownList . Таким образом, поле со списком позволит выбирать только существующие значения, пользователи не смогут вводить новые значения, и текст никогда не будет выделен.

Ответ №8:

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

 new System.Threading.Timer((s) =>
            {
                comboBox1.Invoke(new Action(() =>
                {
                    comboBox1.Select(0, 0);
                }));
            }, null, 10, System.Threading.Timeout.Infinite);
  

Ответ №9:

Не уверен, что вы можете делать в фоновом режиме, т.Е. Запускать события и т. Д. Однако в событии combox selectedindexchanged вы можете добавить другой элемент управления.Выберите ().

Это должно 🙂

Ответ №10:

Вот что я делаю:

 private void faceComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
     this.ActiveControl = cancelButton;
}
  

Ответ №11:

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

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

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

Комментарии:

1. У меня та же проблема, что и у OP, и это не помогло

Ответ №12:

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

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

    c.Focus();
    c.Parent.Focus();
};
  

Ответ №13:

Подпишитесь на событие «SelectedIndexChanged», задача которого — установить фокус выпадающего списка.

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

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

 private void MainForm_Paint(object sender, PaintEventArgs e)
{
    comboBox1.SelectionLength = 0;
}
  

Ответ №14:

‘Select’ у меня не работает. Но я нашел очень простой трюк. Добавьте это прямо в SelectedIndexChanged-событие:

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

Работает для меня.

Ответ №15:

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

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

 Combobox.SelLength :=  0; 
  

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

 Combobox.Style := csDropDownList; 
  

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

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

Комментарии:

1. Простите, но синтаксис, который вы показали здесь, совсем не похож на C #.

2. D5? Вы имеете в виду Delphi? В вопросе с тегом [C #]?