Окно сообщений C # с ComboBox - PullRequest
6 голосов
/ 22 марта 2010

Как создать окно сообщения в приложении C # Win Forms, в котором отображается комбинированный список с серией значений для выбора, а также обычная кнопка «ОК»?

Я хотел бы иметь возможность вызвать это при вызове метода MessageBox.Show(). Я предполагаю, что потребуется какое-то переопределение, но я не видел каких-либо ранее существующих примеров для этого.

Ответы [ 6 ]

9 голосов
/ 22 марта 2010

Используйте пользовательский Form вместо .ShowDialog()

3 голосов
/ 22 марта 2010

Вы не можете.Windows MessageBox имеет ограниченную функциональность.Вы можете открыть окно, похожее на окно диалога, но если вы используете MessageBox, вы ограничены функциональностью, которой обладает MessageBox.

2 голосов
/ 08 декабря 2014

Недавно мне нужно было сделать это для очень маленького вопроса, и вместо создания класса я сгенерировал простую форму со своим комбинированным списком и кнопкой «ОК».Вот моя функция, которая генерирует форму, заполняет ее и получает результаты.Это грязно, но у меня хорошо работает.

/// <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 голос
/ 22 марта 2010

Если вы хотите больше, чем просто ОК (да, не отменять и т. Д.), Попробуйте эту ссылку: http://msdn.microsoft.com/en-us/library/system.windows.forms.messageboxbuttons.aspx

вот пример того, как его использовать: http://msdn.microsoft.com/en-us/library/0x49kd7z.aspx

Однако, если вы хотите свой собственный, вам придется написать его с самого начала. Создайте новую форму и добавьте конструкторы, которые принимают необходимые параметры.

Когда вы закончите, просто используйте

YourDialog dialog = new YourDialog("Button 1", "Button 2");
dialog.ShowDialog();
0 голосов
/ 22 марта 2010

Если окна сообщения недостаточно, вы можете использовать Task Dialog .Если вы должны поддерживать Windows XP, вы не можете использовать собственный API для этого, но существует множество реализаций .NET для Windows Forms и WPF, и это также довольно легко реализовать самостоятельно.Хорошо, что пользователи сегодня привыкли к диалоговым окнам задач, а не к пользовательским окнам сообщений.

0 голосов
/ 22 марта 2010

Вам нужно создать собственную форму, здесь - это учебное пособие о том, как это сделать, оно находится в VB.NET, но его будет достаточно просто сменить на C #.

...