2011-11-09 52 views
15

C# & Net 2.0 hỏi (WinForms)Cách hiển thị văn bản trong combobox khi không có mục nào được chọn?

tôi đã thiết lập các mục trong ComboBox và phi trong số họ chọn. Tôi muốn hiển thị một chuỗi trên combo "Vui lòng chọn mục" trong trường hợp đó.

Triển khai hiện tại chỉ được thêm mục trống với văn bản như vậy trên chỉ mục và xóa nó khi người dùng chọn một trong các mục sau. Rất tiếc, mục trống cũng được hiển thị trong danh sách thả xuống. Làm thế nào để tránh tình trạng này hoặc theo cách khác - có cách nào để hiển thị văn bản tùy chỉnh trên ComboBox khi không có mục nào được chọn không?

Câu trả lời dưới đây hoạt động khi ComboBoxStyle được đặt thành DropDown (ComboBox có thể chỉnh sửa). Có khả năng thực hiện điều này khi ComboBoxStyle được đặt thành DropDownList không?

+0

vậy .... khi người dùng chọn các mục trong combobox bạn không muốn hiển thị văn bản tùy chỉnh trong mục ... – rockyashkumar

+0

Hãy xem http://stackoverflow.com/ question/1426050/how-to-display-default-text-select-team-in-combo-box-on-pageload-in-wpf – PaulB

+0

Tôi đang tìm kiếm giải pháp hoạt động với WinForms không phải WPF. Để được nghiêm chỉnh tôi chỉnh sửa bài đầu tiên và gạch chân này. Cảm ơn. – jotbek

Trả lời

0

Ở đây bạn có thể tìm thấy giải pháp tạo ra bởi pavlo_ua: If you have .Net > 2.0If you have .Net == 2.0 (search for pavlo_ua answer)

Chúc mừng, jbk

chỉnh sửa: Vì vậy, để có câu trả lời rõ ràng không chỉ liên kết

Bạn có thể đặt Văn bản của combobox khi phong cách của nó được đặt là DropDown (và nó có thể chỉnh sửa). Khi bạn có phiên bản Net < 3.0 không có tài sản IsReadonly vì vậy chúng tôi cần phải sử dụng chiến thắng api để thiết textbox của combobox như 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); 
} 
+0

Trong khi điều này về lý thuyết có thể trả lời câu hỏi, [nó sẽ là thích hợp hơn] (http://meta.stackexchange.com/q/8259) để bao gồm các phần thiết yếu của câu trả lời ở đây, và cung cấp liên kết để tham khảo. – codingbadger

+0

bạn có thể sử dụng e.Handled = true trong sự kiện nhấn phím của combobox để ngăn người dùng thay đổi văn bản trong chế độ thả xuống – Arash

12

Sử dụng phương thức chèn của combobox để chèn "Hãy chọn mục" trong 0 index,

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

và thêm tất cả các mục để combobox sau khi chỉ số đầu tiên. Trong tải mẫu

comboBox1.SelectedIndex = 0; 

EDIT:

trong tải hình thức viết văn bản vào comboBox1.Text bởi hardcoding

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

và trong trường hợp TextChanged của comboBox1 viết đoạn mã sau

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

Nhưng điều đó có nghĩa là người dùng có thể chọn tùy chọn này. Tôi đoán người dùng muốn rằng điều này được hiển thị dưới dạng gợi ý và không phải là câu trả lời có thể lựa chọn. – RvdK

+1

Có, đó là triển khai hiện tại của tôi, nhưng mục này được hiển thị trong danh sách thả xuống và người dùng vẫn có thể chọn nó. Tôi muốn tránh tình huống như vậy và chỉ hiển thị văn bản trên combobox nhưng không phải trong danh sách thả xuống. – jotbek

+0

@jotbek, xem bài chỉnh sửa của tôi –

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

nên làm thủ thuật khi khởi động dòng này là hiện tại, khi được chọn một mục trên combobox, mục văn bản này sẽ xuất hiện. khi deleling văn bản văn bản này sẽ xuất hiện trở lại

+0

Vì lý do nào đó, nó không hoạt động. Giải pháp này là giải pháp mà mọi người đề xuất ở đây, nhưng khi tôi đặt thuộc tính Văn bản, nó không giữ giá trị được truyền. Có thể phương thức ToString của các mục trong bộ sưu tập có ưu tiên hơn thuộc tính Text. – jotbek

+1

Nó chỉ hoạt động khi DropDown của ComboBoxStyle được thiết lập. – jotbek

+0

nó hoạt động cho dropdown và phong cách đơn giản, DropdownList không hoạt động. – Moonlight

0

Nếu không có giải pháp trước đây đang làm việc cho bạn, tại sao không thêm một số xác nhận vào combobox giống như,

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

Tùy chọn 0 nghĩa là mục nhập đầu tiên trong hộp kết hợp. Tôi sẽ sử dụng -1 có nghĩa là không có mục nào được chọn. – HelpNeeder

1

Tận dụng tài sản của combo box Dropdownstyle để thả xuống và thiết lập các văn bản combo box để "Chọn" như sau

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

tôi không thể nhìn thấy bất kỳ NET cách tự nhiên để làm điều đó nhưng nếu bạn muốn để có được bàn tay của bạn bẩn với cơ bản Win32 điều khiển ...

Bạn sẽ có thể gửi tin nhắn CB_GETCOMBOBOXINFO với cấu trúc COMBOBOXINFO sẽ chứa bộ điều khiển chỉnh sửa nội bộ. Sau đó, bạn có thể gửi điều khiển chỉnh sửa thông báo EM_SETCUEBANNER bằng con trỏ tới chuỗi. (Lưu ý rằng điều này yêu cầu kích hoạt ít nhất XP và kiểu trực quan.

+0

Vâng Tôi đồng ý, ở đây bạn có giải pháp cho .Net 2.0: [link] http://social.msdn.microsoft.com/Forums/en/winformsdesigner/thread/0004035e-4f1d-4b16-bd97-6123c209fe2f tìm kiếm pavlo_ua solution – jotbek

0

nếu ComboBoxStyle được thiết lập để DropDownList sau đó là cách dễ nhất để đảm bảo người dùng chọn một mục là đặt SelectedIndex = -1, mục này sẽ trống

3

Đây là cách tôi thực hiện. Nó có thể không phải là phương pháp tốt nhất, và cung cấp kiểm soát ít nhất; Tuy nhiên, nó đơn giản và nhanh chóng và tôi nghĩ rằng nó có thể là một ý tưởng tốt để chia sẻ nó để các tùy chọn có sẵn cho những người khác.

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

Ý tưởng đằng sau đây là lựa chọn ban đầu là chỉ mục 0, bị thu gọn, do đó, nó không có sẵn trong lựa chọn cho người dùng khi họ chọn thứ khác. Nhược điểm là bạn phải nhớ rằng nếu bạn đang kiểm tra một chỉ mục đã chọn, hãy nhớ rằng chỉ mục 0 có nghĩa là không có lựa chọn nào được thực hiện.

+1

Câu trả lời chính xác. Lựa chọn ban đầu biến mất sau khi lựa chọn đầu tiên, và không xuất hiện trong danh sách thả xuống. Giải pháp nhanh chóng tuyệt vời. – pollaris

-2

Tại sao không thực hiện XAML?

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

Vì đó là Winforms ... –

+0

điều này không hợp lệ trong XAML –

0

Tôi nhận ra đây là một chủ đề cũ, nhưng chỉ muốn cho những người khác có thể tìm kiếm một câu trả lời cho câu hỏi này biết, trong phiên bản hiện tại của Visual Studio (2015), có một tính chất gọi là "giữ chỗ Văn bản "làm những gì jotbek ban đầu được hỏi về. Sử dụng hộp Thuộc tính, trong thuộc tính "Chung".

+1

Điều đó nghe hay nhưng tôi không thấy thuộc tính đó trong 'ComboBox' trên https://msdn.microsoft.com/en-us/library/system.windows .forms.combobox (v = vs.110) .aspx – user276648

1

Tôi đã sử dụng công việc nhanh chóng để tôi có thể giữ kiểu 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; 
     }    
    }  
} 

Nếu bạn sử dụng databinding, bạn sẽ phải tạo phiên bản giả của loại bạn đang ràng buộc - chỉ cần đảm bảo bạn loại bỏ phiên bản trước khi có bất kỳ sự kiên trì nào.

1

Một dòng sau dưới dạng InitializeComponent();

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

Bạn chỉ cần nó một lần phải không? Tất cả những gì bạn cần làm nếu một lựa chọn là bắt buộc được kiểm tra nếu chỉ mục hộp != -1. Có ai có thể giải thích tại sao các câu trả lời khác nhảy qua hoops để có được điều này?

Điều duy nhất tôi thiếu ở đây là chỉ có văn bản ban đầu này chuyển sang màu xám. Nếu bạn thực sự muốn điều đó chỉ cần sử dụng một nhãn ở phía trước và tắt nó đi khi chỉ mục được thay đổi.

0

Rất tiếc, không có điều nào ở trên phù hợp với tôi, vì vậy, thay vào đó, tôi đã thêm nhãn ở trên hộp combox có nội dung "Vui lòng chọn".Tôi sử dụng đoạn mã sau để hiển thị và ẩn nó:

  1. Khi tôi khởi combobox của tôi, nếu không có giá trị được lựa chọn tôi mang nó đến phía trước và thiết lập các văn bản:

    PleaseSelectValueLabel.BringToFront(); 
    PleaseSelectValueLabel.Text = Constants.AssessmentValuePrompt; 
    
  2. Nếu có được một giá trị được lựa chọn tôi gửi nó để lại:

    PleaseSelectValueLabel.SendToBack(); 
    
  3. tôi sau đó sử dụng các sự kiện sau đây để di chuyển các nhãn vào phía trước hoặc quay trở lại phụ thuộc vào việc người dùng đã lựa chọn một 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

Tôi đã hy vọng để tìm một giải pháp cho điều này là tốt. Tôi thấy rằng đây là một bài đăng cũ hơn, nhưng hy vọng cách tiếp cận của tôi có thể đơn giản hóa vấn đề này cho người khác.

Tôi đã sử dụng combobox với kiểu thả xuống của DropDownList, nhưng điều này sẽ hoạt động với các kiểu khác. Trong trường hợp của tôi, tôi muốn văn bản đọc "Chọn nguồn" và tôi muốn các tùy chọn khác là "Tệp" và "Thư mục"

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

Bạn có thể chọn chỉ mục 0 thay thế nếu muốn. Sau đó tôi đã xóa mục "Chọn nguồn" khi chỉ mục được thay đổi vì nó không còn quan trọng nếu văn bản đó hiển thị.

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

Cảm ơn

Các vấn đề liên quan