Является ли возможность изменять отключенный задний цвет поля со списком ошибкой или особенностью?

#c# #winforms

#c# #winforms

Вопрос:

Я нашел следующее решение: если я добавлю конструктор:

 this.comboBox1.BackColor = System.Drawing.Color.White;  //or any other color
this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; //it has to be that style
  

Я могу изменить цвет comboBox1 — он не всегда будет серым.

Это должен быть выпадающий список, а также BackColor должен быть размещен в конструкторе.

Это ошибка или особенность?

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

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

Ответ №1:

Создайте пользовательский поле со списком, а затем WndProc установите BackColor для отключенного элемента управления.

 public class ComboBoxCustom : ComboBox {
    [DllImport("gdi32.dll")]
    internal static extern IntPtr CreateSolidBrush(int color);

    [DllImport("gdi32.dll")]
    internal static extern int SetBkColor(IntPtr hdc, int color);

    protected override void WndProc(ref Message m){
        base.WndProc(ref m);
        IntPtr brush;
        switch (m.Msg){

            case (int)312:
                SetBkColor(m.WParam, ColorTranslator.ToWin32(this.BackColor));
                brush = CreateSolidBrush(ColorTranslator.ToWin32(this.BackColor));
                m.Result = brush;
                break;
            default:
                break;
        }
    }
}
  

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

1. Как долго я искал это. Работает как по маслу, спасибо, Милош!

Ответ №2:

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

Ответ №3:

Я также столкнулся с этой проблемой, но благодаря DropDownStyle свойству, которое получило ComboBoxStyle enum для установки стиля.

 yourCombo.DropDownStyle = ComboBoxStyle.DropDownList;
  

Ответ №4:

Отключенный элемент управления имеет значение по умолчанию BackColor = Color.Grey . Предполагается, что это будет изменено.

Редактировать:

Я считаю, что это просто «так просто». Да, когда вы начинаете настраивать цвета, должен быть предоставлен код для установки свойств элемента управления во всех состояниях. Подумайте об этом так: .Net предполагает, что если вы собираетесь настраивать свойство, вы берете на себя ответственность за постоянную настройку свойства.

Производный от Control класса, comboBox1 предоставляет Control.EnabledChanged событие. Здесь необходимо реализовать вашу логику, чтобы установить ваши собственные значения по умолчанию для включенного и отключенного состояний; например:

 private void radioButton1_EnabledChanged(object sender, EventArgs e)
{
    if (((ComboBox)sender).Enabled)
    {
        // set BackColor for enabled state
    }
    else
    {
        // set BackColor for disabled state
    }
}
  

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

1. Я думаю, что это совсем не так просто:

2. 1) Задний цвет не меняется при изменении включенного состояния. 2) У BackColor есть странная проблема: когда я меняю его цвет по умолчанию в окне свойств и после этого меняю его обратно — цвет по умолчанию остается в конструкторе — вы можете видеть, что он становится жирным. Этого не происходит с другими свойствами — когда оно возвращается к значению по умолчанию — значение приобретает обычный шрифт, то есть удаляется из конструктора.

3. Вы правы, я могу установить другой обратный цвет, но только если поле со списком является выпадающим списком и его обратный цвет по умолчанию был установлен либо в конструкторе, либо в событии загрузки формы, вы сможете фактически увидеть другой обратный цвет, когда поле со списком отключено. Достаточно даже установить: ComboBox1.BackColor= ComboBox1.BackColor; потому что элемент управления каким-то образом реагирует на набор, даже если изменений не было. Пожалуйста, проверьте это. (Я не новичок в C #…