2010-03-22 54 views
5

¿Cómo puedo producir un cuadro de mensaje en una aplicación C# Win Forms que muestra un cuadro combinado con una serie de valores para seleccionar, así como el botón "Aceptar" habitual?C# Messagebox Con ComboBox

Me gustaría poder desencadenar esto al llamar al método MessageBox.Show(). Supongo que será necesario algún tipo de modificación, pero no he visto ejemplos preexistentes para esto.

Respuesta

8

Usar una costumbre Form lugar con .ShowDialog()

3

No se puede. El MessageBox de Windows tiene una funcionalidad limitada. Puede exponer una ventana de aspecto similar a Dialog, pero si usa MessageBox, estará limitado a la funcionalidad que tiene MessageBox.

1

Si quieres más que simplemente bien (sí no cancelar etc) tratar este enlace: http://msdn.microsoft.com/en-us/library/system.windows.forms.messageboxbuttons.aspx

aquí es un ejemplo de cómo se usa: http://msdn.microsoft.com/en-us/library/0x49kd7z.aspx

Sin embargo, si usted quiere que su propia que tendrá que escribirlo desde el principio. Cree un formulario nuevo y agregue constructores que tomen los parámetros que necesita.

Una vez hecho esto sólo tiene que utilizar

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

Tendrá que crear estás forma propia, here es un tutorial sobre cómo hacerlo, es en VB.NET pero será bastante simple para cambiar a C#.

0

Si un cuadro de mensaje no es suficiente, es posible que desee utilizar un Task Dialog. Si debe admitir Windows XP, no puede usar la API nativa para eso, pero hay muchas implementaciones .NET para Windows Forms y WPF, y también es bastante fácil de implementar. Lo bueno es que los usuarios de hoy están acostumbrados a los cuadros de diálogo de tareas, en lugar de a los cuadros de mensajes personalizados.

2

Recientemente tuve que hacer esto para una pregunta muy pequeña, y en lugar de hacer una clase, genere un formulario simple con mi cuadro combinado y un botón "Aceptar". Aquí está mi función que genera una forma, la rellena y obtiene los resultados. Esto es complicado, pero funciona bien para mí.

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

para aumentar tanto el desorden y la complejidad, que pueden incluir la función de clic hecho dentro de la función que hace que el formulario: Done.Click + = (s, g) => {b = Botón (Button) s ; Forma f = (Forma) b.Parente; f.Close(); }; – BouncyTarget