如果没有选择项目,如何在组合框中显示文本?

jot*_*bek 22 c# .net-2.0 winforms

C#和.Net 2.0问题(WinForms)

我选择了一组项目,ComboBox而没有选择它们.我想在那种情况下在组合" 请选择项目 " 上显示一个字符串.

当前实现只是在索引0上添加了带有此类文本的空项,并在用户选择以下项之一时将其删除.不幸的是,空项目也显示在下拉列表中.如何避免这种情况或以其他方式 - 有什么方法可以ComboBox在没有选择项目时显示自定义文本?

ComboBoxStyle设置为DropDown(ComboBox可编辑)时,下面的答案工作.是否有可能在ComboBoxStyle设置时执行此操作DropDownList

Sai*_*ala 15

使用组合框的插入方法将"请选择项目"插入到0索引中,

comboBox1.Items.Insert(0, "Please select any value");
Run Code Online (Sandbox Code Playgroud)

并在第一个索引后将所有项添加到组合框中.在表单加载集中

comboBox1.SelectedIndex = 0;
Run Code Online (Sandbox Code Playgroud)

编辑:

在表单加载中将文本写入到comboBox1.Text硬编码中

comboBox1.Text = "Please, select any value";
Run Code Online (Sandbox Code Playgroud)

并在comboBox1的TextChanged事件中编写以下代码

 private void comboBox1_TextChanged(object sender, EventArgs e)
        {
            if (comboBox1.SelectedIndex < 0)
            {
                comboBox1.Text = "Please, select any value";
            }
            else
            {
                comboBox1.Text = comboBox1.SelectedText;
            }
        }
Run Code Online (Sandbox Code Playgroud)

  • 但这意味着用户可以选择此项.我想用户希望这显示为提示而不是可选择的答案. (6认同)

Dea*_*nna 5

我看不到任何原生的 .NET 方式来做到这一点,但如果你想用底层的 Win32 控件弄脏你的手......

您应该能够向它CB_GETCOMBOBOXINFO发送带有COMBOBOXINFO包含内部编辑控件句柄的结构的消息。然后,您可以EM_SETCUEBANNER使用指向字符串的指针向编辑控件发送消息。(请注意,这至少需要启用 XP 和视觉样式。


小智 5

在对TextBox 水印 (CueBanner)的响应中,必须归功于 IronRazerz当用户在单行 TextBox(不适用于 RichTextBox)中键入时,该水印会消失

您需要在类中声明以下内容:

private const int CB_SETCUEBANNER = 0x1703;

[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
private static extern int SendMessage(IntPtr hWnd, int msg, int wParam, [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPWStr)]string lParam);
Run Code Online (Sandbox Code Playgroud)

然后你可以用它来做类似的事情:

SendMessage(this.comboBox1.Handle, CB_SETCUEBANNER, 0, "Please select an item...");
Run Code Online (Sandbox Code Playgroud)

这是假设组合框DropDownStyle设置为DropDownList,就像原始海报的问题一样。

这应该会导致如下结果:

组合框下拉列表的占位符文本

  • 这应该是新接受的答案。 (3认同)

jot*_*bek 1

在这里您可以找到 pavlo_ua 创建的解决方案: 如果您有 .Net > 2.0并且 如果您有 .Net == 2.0 (搜索 pavlo_ua 答案)

干杯,jbk

编辑:所以要有明确的答案而不仅仅是链接

当组合框的样式设置为DropDown(并且可编辑)时,您可以设置组合框的文本。当.Net版本<3.0时,没有IsReadonly属性,因此我们需要使用win api将组合框的文本框设置为只读:

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 );
}
Run Code Online (Sandbox Code Playgroud)