2011-11-09 60 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 
      } 
     } 
    } 

感謝

相關問題