2010-03-22 27 views
5

Come posso produrre una messagebox in un'applicazione C# Win Forms che visualizza una casella combinata con una serie di valori da selezionare e il solito pulsante "Ok"?C# Messagebox Con ComboBox

Mi piacerebbe essere in grado di attivare questo chiamando il metodo MessageBox.Show(). Sto assumendo che una sorta di override sarà necessario, ma non ho visto esempi preesistenti per questo.

risposta

8

Utilizzare una consuetudine Form invece con .ShowDialog()

3

Non è possibile. Il MessageBox di Windows ha funzionalità limitate. È possibile esporre una finestra simile all'aspetto come finestra di dialogo, ma se si utilizza MessageBox, si è limitati alla funzionalità di un MessageBox.

1

Se si desidera più di un semplice OK (si no annullare ecc) che provare questo link: http://msdn.microsoft.com/en-us/library/system.windows.forms.messageboxbuttons.aspx

Ecco un esempio su come usarlo: http://msdn.microsoft.com/en-us/library/0x49kd7z.aspx

Tuttavia, se si desidera che il te proprio dovrò scriverlo dall'inizio. Crea un nuovo modulo e aggiungi costruttori che prendono i parametri necessari.

quando il fatto basta usare

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

Avrai bisogno di creare sei propria forma, here è un tutorial su come farlo, è in VB.NET ma sarà abbastanza semplice per passare a C#.

0

Se una finestra di messaggio non è sufficiente, è possibile utilizzare uno Task Dialog. Se è necessario supportare Windows XP, non è possibile utilizzare l'API nativa per questo, ma esistono numerose implementazioni .NET sia per Windows Form che per WPF ed è anche semplice da implementare da solo. La cosa buona è che oggi gli utenti sono abituati a task dialog, piuttosto che caselle di messaggi personalizzate.

2

Recentemente avevo bisogno di fare questo per una domanda molto piccola, e invece di fare una classe, ho generato un semplice modulo con il mio combo-box e un pulsante "OK". Ecco la mia funzione che genera un modulo, lo popola e ottiene i risultati. Questo è disordinato, ma funziona bene per me.

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

per aumentare sia la confusione e la complessità, possiamo includere la funzione di clic fatto all'interno della funzione che rende il modulo: Done.Click + = (s, g) => {Button b = (Button) s ; Forma f = (Forma) b.Parent; f.close(); }; – BouncyTarget