2010-03-22 29 views
5

Làm thế nào tôi có thể tạo một hộp thư trong ứng dụng C# Win Forms hiển thị một combobox với một chuỗi giá trị để chọn cũng như nút "Ok" thông thường?C# Hộp thư với ComboBox

Tôi muốn có thể kích hoạt tính năng này khi gọi phương thức MessageBox.Show(). Tôi giả định một số loại ghi đè sẽ là cần thiết, nhưng tôi đã không nhìn thấy bất kỳ ví dụ từ trước cho việc này.

Trả lời

8

Sử dụng một tùy chỉnh Form thay vì với .ShowDialog()

3

Bạn không thể. Windows MessageBox có chức năng giới hạn. Bạn có thể trưng ra một cửa sổ tìm kiếm tương tự như Dialog, nhưng nếu bạn sử dụng MessageBox, bạn bị giới hạn chức năng MessageBox đang có.

1

Nếu bạn muốn nhiều hơn chỉ là OK (yes no hủy vv) thử liên kết này: http://msdn.microsoft.com/en-us/library/system.windows.forms.messageboxbuttons.aspx

đây là một ví dụ về cách sử dụng nó: http://msdn.microsoft.com/en-us/library/0x49kd7z.aspx

Tuy nhiên nếu bạn muốn riêng của bạn, bạn sẽ phải viết nó ngay từ đầu. Tạo một biểu mẫu mới và thêm các hàm tạo lấy các tham số bạn cần.

Khi bạn thực hiện chỉ cần sử dụng

YourDialog dialog = new YourDialog("Button 1", "Button 2"); 
dialog.ShowDialog(); 
0

Bạn sẽ cần phải tạo ra bạn hình thức riêng, here là một hướng dẫn về làm thế nào để làm điều đó, đó là trong VB.NET nhưng nó sẽ có đủ đơn giản để thay đổi thành C#.

0

Nếu hộp thư không đủ, bạn có thể muốn sử dụng Task Dialog. Nếu bạn phải hỗ trợ Windows XP, bạn không thể sử dụng API gốc cho điều đó, nhưng có rất nhiều triển khai .NET cho cả Windows Forms và WPF, và nó cũng khá dễ thực hiện bởi chính bạn. Điều tốt là người dùng ngày nay được sử dụng để làm nhiệm vụ hộp thoại, chứ không phải là hộp thông báo tùy chỉnh.

2

Gần đây tôi cần làm điều này cho một câu hỏi rất nhỏ, và thay vì làm một lớp, tôi tạo một biểu mẫu đơn giản với hộp kết hợp của tôi và nút "OK". Đây là chức năng của tôi tạo ra một biểu mẫu, điền vào nó, và nhận được kết quả. Điều này là lộn xộn, nhưng nó hoạt động tốt cho tôi.

/// <summary> 
/// Generate a tiny form that prompts the user for the language to use. 
/// </summary> 
private void prompt_for_language() 
{    
    QuestionForm.Text = "Language"; 
    Label lbLanguageChoice = new Label(); 
    lbLanguageChoice.Text = "Choose a Language"; 
    lbLanguageChoice.Location = new Point(1, 1); 
    lbLanguageChoice.Size = new Size(200, lbLanguageChoice.Size.Height); 

    ComboBox LanguageChoices = new ComboBox(); 

    LanguageChoices.Location = new Point(1, lbLanguageChoice.Location.Y + lbLanguageChoice.Height + 5); 
    List<string> language_list = LanguageList(); 
    language_list.Sort(); 
    for (int loop = 0; loop < language_list.Count; loop++) 
     LanguageChoices.Items.Add(language_list[loop]); 
    int def = language_list.IndexOf(CurrentLanguage); 
    if (def < 0) def = language_list.IndexOf(DefaultLanguage); 
    if (def < 0) def = 0; 
    if (language_list.Count < 1) return; //we cannot prompt when there are no languages defined 
    if (def >= 0) LanguageChoices.SelectedIndex = def; 

    Button Done = new Button(); 
    Done.Click += btnClose_Click; 
    Done.Text = "Done"; 
    Done.Location = new Point(1, LanguageChoices.Location.Y + LanguageChoices.Height + 5); ; 
    QuestionForm.Controls.Add(LanguageChoices); 
    QuestionForm.Controls.Add(Done); 
    QuestionForm.Controls.Add(lbLanguageChoice); 
    QuestionForm.FormBorderStyle = FormBorderStyle.FixedDialog; 
    QuestionForm.AutoSize = true; 
    QuestionForm.Height = Done.Location.Y + Done.Height + 5; //This is too small for the form, it autosizes to "big enough" 
    QuestionForm.Width = LanguageChoices.Location.X + LanguageChoices.Width + 5; 
    QuestionForm.ShowDialog(); 
    if (LanguageChoices.SelectedIndex >= 0) 
    { 
     SetLanguage(LanguageChoices.SelectedItem.ToString()); 
    } 
} 

/// <summary> 
/// Used by prompt_for_language -> done button. 
/// </summary> 
/// <param name="sender"></param> 
/// <param name="e"></param> 
private void btnClose_Click(object sender, EventArgs e) 
{ 
    if(QuestionForm != null) 
     QuestionForm.Close(); 
} 
+1

Để tăng cả sự hỗn độn và phức tạp, chúng ta có thể bao gồm các chức năng nhấp chuột thực hiện bên trong hàm mà làm cho có dạng: Done.Click + = (s, g) => {Nút b = (Button) s ; Biểu mẫu f = (Form) b.Parent; f.Close(); }; – BouncyTarget