Запрос диалогового окна в Windows Forms

Я использую System.Windows.Forms, но, как ни странно, у них нет возможности их создавать.

Как я могу получить что-то вроде диалогового окна подсказки javascript без javascript?

MessageBox хорош, но пользователю нечего вводить.

78
25 марта '11 в 2:51
источник поделиться
11 ответов

Вам нужно создать собственное диалоговое окно подсказки. Вы могли бы создать класс для этого.

public static class Prompt
{
    public static string ShowDialog(string text, string caption)
    {
        Form prompt = new Form()
        {
            Width = 500,
            Height = 150,
            FormBorderStyle = FormBorderStyle.FixedDialog,
            Text = caption,
            StartPosition = FormStartPosition.CenterScreen
        };
        Label textLabel = new Label() { Left = 50, Top=20, Text=text };
        TextBox textBox = new TextBox() { Left = 50, Top=50, Width=400 };
        Button confirmation = new Button() { Text = "Ok", Left=350, Width=100, Top=70, DialogResult = DialogResult.OK };
        confirmation.Click += (sender, e) => { prompt.Close(); };
        prompt.Controls.Add(textBox);
        prompt.Controls.Add(confirmation);
        prompt.Controls.Add(textLabel);
        prompt.AcceptButton = confirmation;

        return prompt.ShowDialog() == DialogResult.OK ? textBox.Text : "";
    }
}

И назвав его:

string promptValue = Prompt.ShowDialog("Test", "123");

Обновление

Добавлена ​​кнопка по умолчанию (введите ключ) и начальный фокус на основе комментариев и еще один вопрос.

203
25 марта '11 в 3:06
источник

Добавьте ссылку на Microsoft.VisualBasic и используйте это в свой код С#:

string input = Microsoft.VisualBasic.Interaction.InputBox("Prompt", 
                       "Title", 
                       "Default", 
                       0, 
                       0);
32
11 июля '12 в 17:45
источник

В Windows Forms нет такой вещи изначально.

Для этого вам нужно создать свою собственную форму или:

используйте ссылку Microsoft.VisualBasic.

Ящик ввода - это устаревший код, внедренный в .Net для совместимости с VB6 - поэтому я советую не делать этого.

13
25 марта '11 в 2:59
источник

Как правило, не очень хорошая идея импортировать библиотеки VisualBasic в программы С# (не потому, что они не будут работать, а только для совместимости, стиля и возможности обновления), но вы можете вызвать Microsoft.VisualBasic.Interaction. InputBox(), чтобы отобразить вид окна, который вы ищете.

Если вы можете создать объект Windows.Forms, это было бы лучше, но вы говорите, что не можете этого сделать.

6
25 марта '11 в 2:59
источник

Другой способ сделать это: Предполагая, что у вас есть тип ввода TextBox, Создайте форму и укажите значение текстового поля как общедоступное свойство.

public partial class TextPrompt : Form
{
    public string Value
    {
        get { return tbText.Text.Trim(); }
    }

    public TextPrompt(string promptInstructions)
    {
        InitializeComponent();

        lblPromptText.Text = promptInstructions;
    }

    private void BtnSubmitText_Click(object sender, EventArgs e)
    {
        Close();
    }

    private void TextPrompt_Load(object sender, EventArgs e)
    {
        CenterToParent();
    }
}

В основной форме это будет код:

var t = new TextPrompt(this, "Type the name of the settings file:");
t.ShowDialog()

;

Таким образом, код выглядит более чистым:

  • Если добавлена ​​логика проверки.
  • Если добавлены различные другие типы ввода.
4
14 июня '13 в 0:28
источник

Вам нужно будет создать новую форму для этого, а затем показать ее.

Некоторые примеры создания простой формы входного окна можно найти здесь: http://www.bing.com/search?setmkt=en-GB&q=C%23+input+box

2
25 марта '11 в 2:56
источник

Bas Брекельманс ответ очень изящна в этом простоте. Но я обнаружил, что для реального приложения требуется немного больше, например:

  • Стройте форму соответственно, если текст сообщения слишком длинный.
  • Не отображается автоматически в середине экрана.
  • Не дает никакой проверки ввода пользователя.

В этом классе рассматриваются следующие ограничения: http://www.codeproject.com/Articles/31315/Getting-User-Input-With-Dialogs-Part-1

Я только что загрузил исходный код и скопировал InputBox.cs в свой проект.

Удивленный нет ничего лучше, хотя... Моя единственная реальная жалоба заключается в том, что текст подписи не поддерживает новые строки в нем, поскольку он использует элемент управления меткой.

1
20 авг. '12 в 7:11
источник

Основываясь на работе Bas Brekelmans выше, я также создал два вывода → "вводные" диалоги, которые позволяют вам получать от пользователя как текстовое значение, так и логическое (TextBox и CheckBox):

public static class PromptForTextAndBoolean
{
    public static string ShowDialog(string caption, string text, string boolStr)
    {
        Form prompt = new Form();
        prompt.Width = 280;
        prompt.Height = 160;
        prompt.Text = caption;
        Label textLabel = new Label() { Left = 16, Top = 20, Width = 240, Text = text };
        TextBox textBox = new TextBox() { Left = 16, Top = 40, Width = 240, TabIndex = 0, TabStop = true };
        CheckBox ckbx = new CheckBox() { Left = 16, Top = 60, Width = 240, Text = boolStr };
        Button confirmation = new Button() { Text = "Okay!", Left = 16, Width = 80, Top = 88, TabIndex = 1, TabStop = true };
        confirmation.Click += (sender, e) => { prompt.Close(); };
        prompt.Controls.Add(textLabel);
        prompt.Controls.Add(textBox);
        prompt.Controls.Add(ckbx);
        prompt.Controls.Add(confirmation);
        prompt.AcceptButton = confirmation;
        prompt.StartPosition = FormStartPosition.CenterScreen;
        prompt.ShowDialog();
        return string.Format("{0};{1}", textBox.Text, ckbx.Checked.ToString());
    }
}

... и текст вместе с выбором одной из нескольких опций (TextBox и ComboBox):

public static class PromptForTextAndSelection
{
    public static string ShowDialog(string caption, string text, string selStr)
    {
        Form prompt = new Form();
        prompt.Width = 280;
        prompt.Height = 160;
        prompt.Text = caption;
        Label textLabel = new Label() { Left = 16, Top = 20, Width = 240, Text = text };
        TextBox textBox = new TextBox() { Left = 16, Top = 40, Width = 240, TabIndex = 0, TabStop = true };
        Label selLabel = new Label() { Left = 16, Top = 66, Width = 88, Text = selStr };
        ComboBox cmbx = new ComboBox() { Left = 112, Top = 64, Width = 144 };
        cmbx.Items.Add("Dark Grey");
        cmbx.Items.Add("Orange");
        cmbx.Items.Add("None");
        Button confirmation = new Button() { Text = "In Ordnung!", Left = 16, Width = 80, Top = 88, TabIndex = 1, TabStop = true };
        confirmation.Click += (sender, e) => { prompt.Close(); };
        prompt.Controls.Add(textLabel);
        prompt.Controls.Add(textBox);
        prompt.Controls.Add(selLabel);
        prompt.Controls.Add(cmbx);
        prompt.Controls.Add(confirmation);
        prompt.AcceptButton = confirmation;
        prompt.StartPosition = FormStartPosition.CenterScreen;
        prompt.ShowDialog();
        return string.Format("{0};{1}", textBox.Text, cmbx.SelectedItem.ToString());
    }
}

Оба требуют одинаковые операции:

using System;
using System.Windows.Forms;

Назовите их так:

Назовите их так:

PromptForTextAndBoolean.ShowDialog("Jazz", "What text should accompany the checkbox?", "Allow Scat Singing"); 

PromptForTextAndSelection.ShowDialog("Rock", "What should the name of the band be?", "Beret color to wear");
1
27 мая '14 в 19:18
источник

Ответ Bas может получить вас в памяти теоретически, поскольку ShowDialog не будет удален. Я думаю, что это более правильный путь. Также упоминайте, что textLabel читается с более длинным текстом.

public class Prompt : IDisposable
{
    private Form prompt { get; set; }
    public string Result { get; }

    public Prompt(string text, string caption)
    {
        Result = ShowDialog(text, caption);
    }
    //use a using statement
    private string ShowDialog(string text, string caption)
    {
        prompt = new Form()
        {
            Width = 500,
            Height = 150,
            FormBorderStyle = FormBorderStyle.FixedDialog,
            Text = caption,
            StartPosition = FormStartPosition.CenterScreen,
            TopMost = true
        };
        Label textLabel = new Label() { Left = 50, Top = 20, Text = text, Dock = DockStyle.Top, TextAlign = ContentAlignment.MiddleCenter };
        TextBox textBox = new TextBox() { Left = 50, Top = 50, Width = 400 };
        Button confirmation = new Button() { Text = "Ok", Left = 350, Width = 100, Top = 70, DialogResult = DialogResult.OK };
        confirmation.Click += (sender, e) => { prompt.Close(); };
        prompt.Controls.Add(textBox);
        prompt.Controls.Add(confirmation);
        prompt.Controls.Add(textLabel);
        prompt.AcceptButton = confirmation;

        return prompt.ShowDialog() == DialogResult.OK ? textBox.Text : "";
    }

    public void Dispose()
    {
        prompt.Dispose();
    }
}

Реализация:

using(Prompt prompt = new Prompt("text", "caption")){
    string result = prompt.Result;
}
0
20 окт. '17 в 15:43
источник

Microsoft.VisualBasic.Interaction.InputBox имеет несколько недостатков. Как управлять, если пользователь нажимает ОК или отменяет? Вы не можете.

Вы должны написать свой собственный класс или использовать что-то вроде OOKII Dialogs 'InputControl. OOKII отлично.

0
25 авг. '15 в 12:10
источник

Вот пример в VB.NET

Public Function ShowtheDialog(caption As String, text As String, selStr As String) As String
    Dim prompt As New Form()
    prompt.Width = 280
    prompt.Height = 160
    prompt.Text = caption
    Dim textLabel As New Label() With { _
         .Left = 16, _
         .Top = 20, _
         .Width = 240, _
         .Text = text _
    }
    Dim textBox As New TextBox() With { _
         .Left = 16, _
         .Top = 40, _
         .Width = 240, _
         .TabIndex = 0, _
         .TabStop = True _
    }
    Dim selLabel As New Label() With { _
         .Left = 16, _
         .Top = 66, _
         .Width = 88, _
         .Text = selStr _
    }
    Dim cmbx As New ComboBox() With { _
         .Left = 112, _
         .Top = 64, _
         .Width = 144 _
    }
    cmbx.Items.Add("Dark Grey")
    cmbx.Items.Add("Orange")
    cmbx.Items.Add("None")
    cmbx.SelectedIndex = 0
    Dim confirmation As New Button() With { _
         .Text = "In Ordnung!", _
         .Left = 16, _
         .Width = 80, _
         .Top = 88, _
         .TabIndex = 1, _
         .TabStop = True _
    }
    AddHandler confirmation.Click, Sub(sender, e) prompt.Close()
    prompt.Controls.Add(textLabel)
    prompt.Controls.Add(textBox)
    prompt.Controls.Add(selLabel)
    prompt.Controls.Add(cmbx)
    prompt.Controls.Add(confirmation)
    prompt.AcceptButton = confirmation
    prompt.StartPosition = FormStartPosition.CenterScreen
    prompt.ShowDialog()
    Return String.Format("{0};{1}", textBox.Text, cmbx.SelectedItem.ToString())
End Function
-2
11 янв. '16 в 22:45
источник

Посмотрите другие вопросы по меткам или Задайте вопрос