#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
У меня все работает нормально