如果没有选择项目,如何在combobox中显示文字?

C#和.Net 2.0问题(WinForms)

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

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

ComboBoxStyle设置为DropDown时,下面的答案工作( ComboBox是可编辑的)。 当ComboBoxStyle设置为DropDownList时,是否有可能这样做?

使用combobox的插入方法将“请选择项目”插入到0索引中,

 comboBox1.Items.Insert(0, "Please select any value"); 

并在第一个索引后将所有项添加到combobox中。 在表单加载集中

 comboBox1.SelectedIndex = 0; 

编辑:

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

 comboBox1.Text = "Please, select any value"; 

并在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; } } 

我就是这样做的。 它可能不是最好的方法,并提供最少的控制; 然而,它简单快捷,我认为分享它可能是一个好主意,以便为其他人提供更多选择。

  Please select one... 1 2 3 4  

这背后的想法是初始选择是索引0,它是折叠的,所以一旦他们选择其他东西,它就不能在用户的选择下可用。 缺点是您必须记住,如果您正在检查所选索引,请记住索引0表示没有选择。

  private void comboBox1_TextChanged(object sender, EventArgs e) { if (comboBox1.Text == "") comboBox1.Text = "Select one of the answers"; } 

应该在启动时执行这一行的技巧,当在combobox中选择一个项目时,将显示此项目文本。 删除文本时,此文本将再次出现

将combobox的Dropdownstyle属性设置为Dropdown,并将combobox文本设置为“Select”,如下所示

  combobox.DataSource = dsIn.Tables[0]; combobox.DisplayMember = "Name"; combobox.ValueMember = "Value"; combobox.Text = "--Select--"; 

我看不到任何原生的.NET方法,但如果你想弄脏底层的Win32控件……

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

我使用了一个快速的工作,所以我可以保持DropDownList风格。

 class DummyComboBoxItem { public string DisplayName { get { return "Make a selection ..."; } } } public partial class mainForm : Form { private DummyComboBoxItem placeholder = new DummyComboBoxItem(); public mainForm() { InitializeComponent(); myComboBox.DisplayMember = "DisplayName"; myComboBox.Items.Add(placeholder); foreach(object o in Objects) { myComboBox.Items.Add(o); } myComboBox.SelectedItem = placeholder; } private void myComboBox_SelectedIndexChanged(object sender, EventArgs e) { if (myComboBox.SelectedItem == null) return; if (myComboBox.SelectedItem == placeholder) return; /* do your stuff */ myComboBox.Items.Add(placeholder); myComboBox.SelectedItem = placeholder; } private void myComboBox_DropDown(object sender, EventArgs e) { myComboBox.Items.Remove(placeholder); } private void myComboBox_Leave(object sender, EventArgs e) { //this covers user aborting the selection (by clicking away or choosing the system null drop down option) //The control may not immedietly change, but if the user clicks anywhere else it will reset if(myComboBox.SelectedItem != placeholder) { if(!myComboBox.Items.Contains(placeholder)) myComboBox.Items.Add(placeholder); myComboBox.SelectedItem = placeholder; } } } 

如果使用数据绑定,则必须创建所绑定类型的虚拟版本 – 只需确保在任何持久性逻辑之前删除它。

forms为InitializeComponent();之后的一行InitializeComponent();

 cbo_MyDropBox.Text = "Select a server..."; 

你只需要一次吗? 如果选择是必需的,您需要做的就是检查框索引!= -1 。 任何人都可以详细说明为什么其他答案会通过箍来实现这一目标吗?

我在这里唯一缺少的是只有这个初始文本变灰了。 如果你真的想要只使用前面的标签,并在索引改变后将其关闭。

如果之前的解决方案都不适合您,为什么不在combobox上添加一些validation,比如

  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; } } 

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

干杯,jbk

编辑:所以要明确回答不仅仅是链接

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

 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 ); } 

如果ComboBoxStyle设置为DropDownList那么确保用户选择项目的最简单方法是设置SelectedIndex = -1 ,这将是空的

我意识到这是一个旧线程,但只是想让其他可能搜索此问题答案的人知道,在当前版本的Visual Studio(2015)中,有一个名为“Placeholder Text”的属性可以执行jotbek最初的操作问道。 使用“常用”属性下的“属性”框。

不幸的是,以上都没有为我工作,所以我在comboxbox的顶部添加了一个标签,上面写着“请选择”。 我使用以下代码来显示和隐藏它:

  1. 当我初始化我的combobox时,如果没有选定的值,我将它带到前面并设置文本:

     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(); } } 

我也希望能找到解决方案。 我看到这是一篇较旧的post,但希望我的方法可以为其他人简化这个问题。

我使用的是带有下拉式DropDownList的combobox,但这应该适用于其他样式。 在我的情况下,我希望文本读取“选择源”,我希望其他选项是“文件”和“文件夹”

 comboBox1.Items.AddRange(new string[] {"Select Source", "File", "Folder" }); comboBox1.Text = "Select Source"; 

如果您愿意,可以选择0索引。 然后,当索引更改时,我删除了“选择源”项,因为如果该文本可见则不再重要。

 comboBox1.SelectedIndexChanged += new EventHandler(comboBox1_IndexChanged); private void comboBox1_IndexChanged(object sender, EventArgs e) { comboBox1.Items.Remove("Select Source"); if (comboBox1.SelectedIndex != -1) { if (comboBox1.SelectedIndex == 0) // File { // Do things } else if (comboBox1.SelectedIndex == 1) // Folder { // Do things } } } 

谢谢

为什么不做XAML?