2010-03-22 1 views
5

Comment puis-je créer une boîte de message dans une application C# Win Forms qui affiche une zone de liste déroulante avec une série de valeurs à sélectionner ainsi que le bouton "OK" habituel?C# Messagebox Avec ComboBox

Je voudrais pouvoir déclencher cela en appelant la méthode MessageBox.Show(). Je suppose qu'une sorte de dérogation sera nécessaire, mais je n'ai vu aucun exemple préexistant pour cela.

Répondre

8

Utilisez une coutume Form place avec .ShowDialog()

3

Vous ne pouvez pas. Le Windows MessageBox a des fonctionnalités limitées. Vous pouvez exposer une fenêtre similaire à Dialog, mais si vous utilisez le MessageBox, vous êtes limité à la fonctionnalité d'un MessageBox.

1

Si vous voulez plus que OK (oui annuler pas etc) essayez ce lien: http://msdn.microsoft.com/en-us/library/system.windows.forms.messageboxbuttons.aspx

ici est un exemple sur la façon de l'utiliser: http://msdn.microsoft.com/en-us/library/0x49kd7z.aspx

Toutefois, si vous voulez que votre propre vous devra l'écrire depuis le début. Créez un nouveau formulaire et ajoutez des constructeurs qui prennent les paramètres dont vous avez besoin.

Lorsque vous avez terminé il suffit d'utiliser

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

Vous devez vous créer êtes propre forme, here est un tutoriel sur la façon de le faire, il est en VB.NET, mais ça va être assez simple pour changer en C#.

0

Si une boîte de message ne suffit pas, vous pouvez utiliser un Task Dialog. Si vous devez prendre en charge Windows XP, vous ne pouvez pas utiliser l'API native pour cela, mais il existe de nombreuses implémentations .NET pour Windows Forms et WPF, et il est également très facile à mettre en œuvre par vous-même. La bonne chose est que les utilisateurs d'aujourd'hui sont habitués à des boîtes de dialogue de tâches, plutôt que des boîtes de message personnalisées.

2

Récemment, j'avais besoin de faire cela pour une très petite question, et au lieu de faire un cours, j'ai généré un formulaire simple avec ma combo-box et un bouton "OK". Voici ma fonction qui génère un formulaire, le remplit et obtient les résultats. C'est désordonné, mais ça marche bien pour moi.

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

Pour accroître à la fois la complexité et salissant, nous pouvons inclure la fonction de clic fait dans la fonction qui fait la forme: Done.Click + = (s, g) => {b = Bouton (Bouton) s ; Forme f = (Forme) b.Parent; f.Fermer(); } – BouncyTarget