Остановить выделение цветом выбранного элемента в выпадающем списке?

#c# #.net #winforms #combobox

#c# #.net #winforms #выпадающий список

Вопрос:

Я использую поле со списком в WinForm, но когда я выбрал любой элемент в поле со списком, цвет фона выбранного элемента стал синим. я хочу удалить этот синий цвет фона (особенно при загрузке формы, пытался установить фокус на другой элемент управления в форме, но выделение со списком не удалялось), но элемент должен быть выбран.

Кто-нибудь может помочь в этом …?

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

1. Уверен, вы можете просто установить для выбранного индекса значение -1, но прошло некоторое время.

2. но элемент должен быть выбран…

3. Вы используете специальную цветовую тему в Windows?? это не должно происходить в общей комбинации. Попробуйте удалить эту комбинацию и добавить новую. @asawyer это очистит комбо, но это не то, о чем спрашивает OP 😉

4. @Dhana Я вижу, извините, я это пропустил. Я полагаю, вы всегда можете переопределить рендеринг и нарисовать вещь самостоятельно. Тогда это любой цвет, который вы хотите.

Ответ №1:

Чтобы решить то же самое, я перепробовал почти ВСЕ:

  • установка DropdownStyle свойства в DropDownList
  • this.BeginInvoke(new Action(() => { comboBox1.Select(0, 0); }));
  • combobox1.SelectionLength = 0;
  • изменение comboBox.TabIndex
  • Не пробовал SendKeys.Send("{ESC}"); , потому что это ненадежное решение

Ничего не помогло. Может быть, потому, что у меня нет текста в элементах выпадающего списка, только изображения. Единственным стабильным и работающим решением было переместить фокус на другой элемент управления Label:

     label.Focus();
  

Вы также можете скрыть эту метку.

Ответ №2:

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

Вот пример, когда кто-то это делает:

http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/e234c4a7-0cf7-4284-a072-8152f7593002/

Вероятно, в Интернете есть еще что-то, что поможет вам.

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

1. Данная ссылка объясняет, как отображать всплывающую подсказку при наведении курсора мыши на элемент выпадающего списка. Это не ответ на вопрос.

Ответ №3:

Я нашел кое-что на этом сайте

Создайте таймер и включите его в своем событии SelectedIndexChanged, а в таймере просто добавьте ComboBox1.Select(0,0) это, чтобы удалить часть выбора, а затем отключить таймер. Определите другие точки входа, в которых вы можете Enable снова запустить таймер

Фрагмент кода

 private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
    //Get the item selected in the combobox
    ComboBox cbx = (ComboBox)sender;
    int idx = cbx.SelectedIndex;    
    string s1 = cbx.SelectedItem.ToString();
    // Enable the time so that the Highlight can be removed
    timer1.Enabled = true;
}

private void timer1_Tick(object sender, EventArgs e)
{
    // Remove the Highlight
    comboBox1.Select(0, 0);
    // Disable timer
    timer1.Enabled = false;
}
  

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

1. ComboBox1.Select(0, 0) — не работает, поскольку в выпадающем списке combobox не разрешен редактируемый текст..,

2. @Dhana Тогда настройка comboBox1.SelectionLength=0 работает?

Ответ №4:

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

У меня есть выпадающий список в пользовательской форме. Выбрав выпадающий список и просмотрев свойства, просто изменив ‘HideSelection’ на True, для меня сработало. Вы также можете закодировать для этого: ComboBox1.HideSelection = True

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

1. Это правильное решение. Хотя ваш ответ касается VBA, он одинаков для WinForms с C # и VB.NET . Вам нужно установить HideSelection для свойства значение true . Странно, однако; это должно быть по умолчанию.

2. @Cody Gray — Я не могу найти HideSelection свойство для выпадающего списка в Windows Forms. Он существует для TextBoxBase и элементов управления, которые наследуются от него, а ComboBox — нет. Какой позор, так как мне бы очень хотелось! (Я использую Visual Studio 2013 с .NET 4.5)

3. @jonp Хм, я не знаю, о чем я думал, когда писал этот комментарий несколько лет назад. Предположительно, это сработало для меня в то время. Я подумал, что, возможно, ComboBox просто скрывает метод базового класса, но быстрый просмотр ссылочного источника показывает, что он даже не имеет той же иерархии, что и TextBox. Он фактически наследуется от ListControl, который наследуется от Control. Таким образом, нет скрытого свойства для установки. Возможно, вы можете получить доступ к базовому элементу управления текстовым полем. NET не предоставляет никакого управляемого способа сделать это. Вам придется использовать P / Invoke, чтобы получить дескриптор. …

4. Задайте новый вопрос или назначьте награду за этот, если вам нужно полное решение. Хотя я должен задаться вопросом, зачем кому-то это действительно нужно. Во всех выпадающих списках, которые я видел, скрытие выделения по умолчанию. Любое сделанное выделение исчезает, когда фокус покидает элемент управления выпадающего списка. Это все, что делает свойство HideSelection. Как я уже говорил ранее, это значение по умолчанию для элементов управления textbox и combobox. Если вы задаете новый вопрос, обязательно уточните, что отличает вашу ситуацию. @jonp

5. @Cody Я не говорил, что мне нужно установить значение true; Мне нужно установить значение false! Моя функция поиска / замены выбирает найденный текст, чтобы выделить его, а затем показывает диалоговое окно с вопросом, хотите ли вы заменить это вхождение, которое теряет фокус на выпадающем списке и выделение исчезает. Я задам новый вопрос, если не смогу решить его другим способом (я чувствую, что люди слишком быстро задают вопросы на этом форуме, сначала им нужно немного постараться!)

Ответ №5:

Для вас есть простое решение

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

надеюсь, это поможет 🙂

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

1. разве это не уменьшит выделение?

Ответ №6:

Простой способ просто отключить выпадающий список, а затем включить его

 combobox.Enabled = false;
combobox.Enabled = true;
  

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

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

1. ^^^ Это именно то решение, которое ищут люди. Лучший ответ в моей книге. Спасибо ^^^

Ответ №7:

Я столкнулся с той же проблемой, и, не найдя рабочего решения, у меня возникла та же идея, что и у @Vadim K.

Вот краткий пример.

Первый шаг — изменить фокус в событии UI_Load.

 Private Sub UI_Load(sender As System.Object, e As System.EventArgs) Handles Me.Load    
    Me.lblTitle.Focus()
End Sub
  

Следующий шаг — обработать случай, когда кто-то выбирает новое значение

 Private Sub comboExportDates_SelectedIndexChanged(sender As Object, e As EventArgs) Handles comboExportDates.SelectedIndexChanged
        Me.lblTitle.Focus()
End Sub
  

У меня все работает нормально