Как показать текст в выпадающем списке, когда ни один элемент не выбран? - PullRequest
21 голосов
/ 09 ноября 2011

C # & .Net 2.0 вопрос (WinForms)

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

Текущая реализация просто добавляет пустой элемент с таким текстом в индекс 0 и удаляет его, когда пользователь выбирает один из следующих элементов. К сожалению, пустой элемент также отображается в выпадающем списке. Как избежать этой ситуации или другим способом - есть ли способ отобразить пользовательский текст на ComboBox, когда ни один элемент не выбран?

Ответы ниже работают, когда ComboBoxStyle установлен на DropDown (ComboBox редактируемый). Есть ли возможность сделать это, когда ComboBoxStyle установлен на DropDownList?

Ответы [ 16 ]

0 голосов
/ 20 марта 2017

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

  1. Когда я инициализирую свой комбинированный список, если не выбрано никакого значения, я выношу его на передний план и устанавливаю текст:

    PleaseSelectValueLabel.BringToFront();
    PleaseSelectValueLabel.Text = Constants.AssessmentValuePrompt;
    
  2. Если выбрано значение, я отправляю его обратно:

    PleaseSelectValueLabel.SendToBack();
    
  3. Затем я использую следующие события, чтобы переместить метку впередний или задний в зависимости от того, выбрал ли пользователь значение:

    private void PleaseSelectValueLabel_Click(object sender, EventArgs e)
    {
        PleaseSelectValueLabel.SendToBack();
        AssessmentValue.Focus();
    }
    
    private void AssessmentValue_Click(object sender, EventArgs e)
    {
        PleaseSelectValueLabel.SendToBack();
    }
    
    //if the user hasnt selected an item, make the please select label visible again
    private void AssessmentValue_Leave(object sender, EventArgs e)
    {
        if (AssessmentValue.SelectedIndex < 0)
        {
            PleaseSelectValueLabel.BringToFront();
        }
    }
    
0 голосов
/ 24 октября 2015

Я понимаю, что это старая ветка, но я просто хотел, чтобы другие, кто мог бы найти ответ на этот вопрос, знали, что в текущей версии Visual Studio (2015) есть свойство «Заполнитель текста»,о чем первоначально спросил Йотбек.Используйте поле «Свойства» в разделе «Общие» свойства.

0 голосов
/ 11 апреля 2015

Почему бы не сделать это XAML?

<ComboBox x:Name="myComboBoxMenu" PlaceholderText="Hello"/>
0 голосов
/ 02 октября 2013

, если ComboBoxStyle установлено на DropDownList, то самый простой способ убедиться, что пользователь выбирает элемент, это установить SelectedIndex = -1, который будет пустым

0 голосов
/ 10 ноября 2011

Здесь вы можете найти решение, созданное pavlo_ua: Если у вас есть .Net> 2.0 и Если у вас есть .Net == 2.0 (поиск ответа pavlo_ua)

Ура, JBK

редактирование: Чтобы иметь четкий ответ, а не просто ссылку

Вы можете установить текст в выпадающем списке, когда его стиль установлен как DropDown (и он редактируемый). Если у вас версия .Net <3.0, свойство IsReadonly отсутствует, поэтому нам нужно использовать win api, чтобы установить текстовое поле в выпадающем списке только для чтения: </p>

private bool m_readOnly = false;
private const int EM_SETREADONLY = 0x00CF;

internal delegate bool EnumChildWindowsCallBack( IntPtr hwnd, IntPtr lParam );

[DllImport("user32.dll", CharSet = CharSet.Auto)]
internal static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

[ DllImport( "user32.dll" ) ]
internal static extern int EnumChildWindows( IntPtr hWndParent, EnumChildWindowsCallBack lpEnumFunc, IntPtr lParam );


private bool EnumChildWindowsCallBackFunction(IntPtr hWnd, IntPtr lparam)
{
      if( hWnd != IntPtr.Zero )
       {
              IntPtr readonlyValue = ( m_readOnly ) ? new IntPtr( 1 ) : IntPtr.Zero;
             SendMessage( hWnd, EM_SETREADONLY, readonlyValue, IntPtr.Zero );
             comboBox1.Invalidate();
             return true;
       }
       return false;
}

private void MakeComboBoxReadOnly( bool readOnly )
{
    m_readOnly = readOnly;
    EnumChildWindowsCallBack callBack = new EnumChildWindowsCallBack(this.EnumChildWindowsCallBackFunction );
    EnumChildWindows( comboBox1.Handle, callBack, IntPtr.Zero );
}
0 голосов
/ 09 ноября 2011

Если ни одно из предыдущих решений не работает для вас, почему бы не добавить некоторую проверку в комбинированный список, например,

    var orginalindex = 0;

    private void comboBox1_SelectedItemChanged(object sender, EventArgs e)
    {
        if (comboBox1.SelectedIndex == 0)
        {
            comboBox1.Text = "Select one of the answers";
            comboBox1.SelectedIndex = comboBox1.SelectedIndex;
        }
        else
        {
            orginalindex = comboBox1.SelectedIndex;
        }
    }
...