2011-11-09 49 views
15

C#& NET 2.0问题(的WinForms)如何在未选择任何项目时在组合框中显示文本?

我在ComboBox设置的项目,并将它们的非选择。我想在这种情况下在组合上显示一个字符串“请选择项目”。

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

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

+0

这样....当用户在组合框中选择项目你不想显示的项目自定义文本... – rockyashkumar

+0

看看http://stackoverflow.com/问题/ 1426050/how-to-display-default-text-select-team-in-wpf – PaulB

+0

我正在寻找能够与WinForms而非WPF一起工作的解决方案。严格来说,我先编辑并强调了这一点。谢谢。 – jotbek

回答

0

在这里,你可以找到pavlo_ua创建解决方案: If you have .Net > 2.0If you have .Net == 2.0 (search for pavlo_ua answer)

干杯,JBK

编辑: 所以有明确的答案不只是链接

您可以设置组合框的文本当其样式设置为DropDown(并且它是可编辑的)时。 当你有.NET版本< 3.0没有IsReadOnly属性,所以我们需要用胜利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); 
} 
+0

虽然这可能在理论上回答这个问题,[这将是更可取的](http://meta.stackexchange.com/q/8259)在这里包括答案的基本部分,并提供参考链接。 – codingbadger

+0

您可以在组合框的按键事件中使用e.Handled = true来防止用户在下拉模式下更改文字 – Arash

12

使用组合框的插入方法中插入了“请选择商品” 0指数,

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

和第一索引之后的所有项目添加到组合框。形式负载设定

comboBox1.SelectedIndex = 0; 

编辑:

在形式负载通过硬编码

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

并在comboBox1的TextChanged事件写入以下代码写入到comboBox1.Text文本

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

但是,这意味着用户可以选择这个。我想用户希望这显示为提示而不是可选答案。 – RvdK

+1

是的,这是我目前的实现,但是这个项目显示在下拉列表中,用户仍然可以选择它。我想避免这种情况,只显示组合框中的文本,但不能显示在下拉列表中。 – jotbek

+0

@jotb​​ek,看我编辑的文章 –

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

应该在启动时执行这个技巧 这行是存在的,当在组合框上选择一个项目时,这个项目文本将出现。 deleling文本时,该文本将再次出现

+0

由于某些原因,它不起作用。这个解决方案是每个人都在这里推荐的,但是当我设置Text属性时,它不会保持传递值。可能ToString方法中的项目集合优先于Text属性。 – jotbek

+1

只有在设置了ComboBoxStyle的DropDown时才有效。 – jotbek

+0

它适用于下拉式和简单样式,DropdownList不起作用。 – Moonlight

0

如果没有前面的解决方案都为你工作,为什么不上组合框像添加一些验证,

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

选项0表示组合框中的第一个条目。我会使用-1,这意味着没有选择任何项目。 – HelpNeeder

1

使组合框的DropDownStyle属性到下拉并设置组合框的文本为“选择”,如下

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

我看不到任何本地.NET的方式来做到这一点,但如果你想获得你的手脏与底层的Win32控制...

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

+0

是的我同意,在这里你有.Net 2.0的解决方案: [link] http://social.msdn.microsoft.com/Forums/en/winformsdesigner/thread/0004035e-4f1d-4b16-bd97-6123c209fe2f 搜索pavlo_ua解决方案 – jotbek

0

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

3

以下是我如何做到这一点。它可能不是最好的方法,并且提供最少的控制;不过,它很简单,快捷,我认为分享它可能是一个好主意,这样可以为其他人提供更多选择。

<ComboBox SelectedIndex="0"> 
    <ComboBoxItem Visibility="Collapsed">Please select one...</ComboBoxItem> 
    <ComboBoxItem>1</ComboBoxItem> 
    <ComboBoxItem>2</ComboBoxItem> 
    <ComboBoxItem>3</ComboBoxItem> 
    <ComboBoxItem>4</ComboBoxItem> 
</ComboBox> 

这背后的想法是,最初的选择是指数0,它被折叠,因此它一旦他们选择别的选择下,不供用户使用。缺点是你必须记住,如果你正在检查一个选定的索引,记住索引0意味着没有选择。

+1

极好的答案。初始选择在第一次选择后消失,并且不出现在下拉列表中。了不起的快速解决方案。 – pollaris

-2

为什么不这样做XAML?

<ComboBox x:Name="myComboBoxMenu" PlaceholderText="Hello"/> 
+5

因为它是Winforms ... –

+0

这在XAML中是无效的 –

0

我意识到这是一个古老的线程,但只是想让其他人谁可能会寻找一个答案,这个问题的认识,在Visual Studio(2015年)的当前版本中,有一个名为“占位符属性文本“,它完成了jotbek最初询问的内容。使用“常用”属性下的属性框。

+1

听起来不错,但我在https://msdn.microsoft.com/zh-cn/library/system.windows上的ComboBox下看不到该属性.forms.combobox(v = vs.110)的.aspx – user276648

1

我用了一个快速解决方法,所以我可以保持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; 
     }    
    }  
} 

如果您使用数据绑定,你必须创建你一定类型的虚拟版本 - 只要确保你的任何持久性逻辑之前将其删除。表格后

1

一号线InitializeComponent();

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

你只需要一次吗?所有你需要做的,如果一个选择是强制性的是检查框索引!= -1。任何人都可以详细说明为什么其他答案跳过篮球来实现这一目标吗?

我在这里错过的唯一一件事就是把这个初始文本变成灰色。如果您真的希望只在前面使用标签,并且在索引更改后将其关闭。

0

不幸的是,上述任何一个都不适合我,所以相反,我在comboxbox的顶部添加了一个标签,上面写着“请选择”。我用下面的代码来显示和隐藏:

  1. 当我初始化我的组合框,如果没有选定值我把它的前部和设置文本:

    PleaseSelectValueLabel.BringToFront(); 
    PleaseSelectValueLabel.Text = Constants.AssessmentValuePrompt; 
    
  2. 如果有一个值来选择我把它发送到回:

    PleaseSelectValueLabel.SendToBack(); 
    
  3. 然后我用下面的事件标签移动到前面或后面取决于用户是否已选择VALU E:

    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

我希望能找到一个解决这一点。我看到这是一个较旧的帖子,但希望我的方法可以简化别人的这个问题。

我正在使用DropDownList下拉样式的组合框,但这应该与其他样式一起使用。在我的情况,我想文本阅读“选择源”,我想其他的选项是“文件”和“文件夹”

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

感谢

相关问题