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)
我看不到任何原生的 .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,就像原始海报的问题一样。
这应该会导致如下结果:
在这里您可以找到 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)
| 归档时间: |
|
| 查看次数: |
114436 次 |
| 最近记录: |