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

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

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

MessageBox хорош, но пользователь не может ввести данные.

Я хочу, чтобы пользователь вводил любой возможный текстовый ввод.

Ответ 1

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

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");

Обновление

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

Ответ 2

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

string input = Microsoft.VisualBasic.Interaction.InputBox("Prompt", 
                       "Title", 
                       "Default", 
                       0, 
                       0);

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

Другой способ сделать это: Предполагая, что у вас есть тип ввода 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()

;

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

  • Если добавлена ​​логика проверки.
  • Если добавлены различные другие типы ввода.

Ответ 6

Ответ баса теоретически может привести вас к проблеме памяти, так как 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()
    {
        //See Marcus comment
        if (prompt != null) { 
            prompt.Dispose(); 
        }
    }
}

Реализация:

using(Prompt prompt = new Prompt("text", "caption")){
    string result = prompt.Result;
}

Ответ 7

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

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

Ответ 8

Основываясь на работе 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");

Ответ 9

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

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

Класс здесь обрабатывает эти ограничения: http://www.codeproject.com/Articles/31315/Getting-User-Input-With-Dialogs-Part-1

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

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

Ответ 10

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

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

Ответ 11

здесь моя рефакторинговая версия, которая принимает многострочный/одиночный в качестве опции

   public string ShowDialog(string text, string caption, bool isMultiline = false, int formWidth = 300, int formHeight = 200)
        {
            var prompt = new Form
            {
                Width = formWidth,
                Height = isMultiline ? formHeight : formHeight - 70,
                FormBorderStyle = isMultiline ? FormBorderStyle.Sizable : FormBorderStyle.FixedSingle,
                Text = caption,
                StartPosition = FormStartPosition.CenterScreen,
                MaximizeBox = isMultiline
            };

            var textLabel = new Label
            {
                Left = 10,
                Padding = new Padding(0, 3, 0, 0),
                Text = text,
                Dock = DockStyle.Top
            };

            var textBox = new TextBox
            {
                Left = isMultiline ? 50 : 4,
                Top = isMultiline ? 50 : textLabel.Height + 4,
                Multiline = isMultiline,
                Dock = isMultiline ? DockStyle.Fill : DockStyle.None,
                Width = prompt.Width - 24,
                Anchor = isMultiline ? AnchorStyles.Left | AnchorStyles.Top : AnchorStyles.Left | AnchorStyles.Right
            };

            var confirmationButton = new Button
            {
                Text = @"OK",
                Cursor = Cursors.Hand,
                DialogResult = DialogResult.OK,
                Dock = DockStyle.Bottom,
            };

            confirmationButton.Click += (sender, e) =>
            {
                prompt.Close();
            };

            prompt.Controls.Add(textBox);
            prompt.Controls.Add(confirmationButton);
            prompt.Controls.Add(textLabel);

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

Ответ 12

К сожалению, С# все еще не предлагает эту возможность во встроенных библиотеках. Лучшее решение в настоящее время - создать пользовательский класс с методом, который вызывает маленькую форму. Если вы работаете в Visual Studio, вы можете сделать это, нажав Project> Add class

Add Class

Элементы Visual С#> код> класс Add Class 2

Назовите класс PopUpBox (вы можете переименовать его позже, если хотите) и вставьте следующий код:

using System.Drawing;
using System.Windows.Forms;

namespace yourNameSpaceHere
{
    public class PopUpBox
    {
        private static Form prompt { get; set; }

        public static string GetUserInput(string instructions, string caption)
        {
            string sUserInput = "";
            prompt = new Form() //create a new form at run time
            {
                Width = 500, Height = 150, FormBorderStyle = FormBorderStyle.FixedDialog, Text = caption,
                StartPosition = FormStartPosition.CenterScreen, TopMost = true
            };
            //create a label for the form which will have instructions for user input
            Label lblTitle = new Label() { Left = 50, Top = 20, Text = instructions, Dock = DockStyle.Top, TextAlign = ContentAlignment.TopCenter };
            TextBox txtTextInput = new TextBox() { Left = 50, Top = 50, Width = 400 };

            ////////////////////////////OK button
            Button btnOK = new Button() { Text = "OK", Left = 250, Width = 100, Top = 70, DialogResult = DialogResult.OK };
            btnOK.Click += (sender, e) => 
            {
                sUserInput = txtTextInput.Text;
                prompt.Close();
            };
            prompt.Controls.Add(txtTextInput);
            prompt.Controls.Add(btnOK);
            prompt.Controls.Add(lblTitle);
            prompt.AcceptButton = btnOK;
            ///////////////////////////////////////

            //////////////////////////Cancel button
            Button btnCancel = new Button() { Text = "Cancel", Left = 350, Width = 100, Top = 70, DialogResult = DialogResult.Cancel };
            btnCancel.Click += (sender, e) => 
            {
                sUserInput = "cancel";
                prompt.Close();
            };
            prompt.Controls.Add(btnCancel);
            prompt.CancelButton = btnCancel;
            ///////////////////////////////////////

            prompt.ShowDialog();
            return sUserInput;
        }

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

Вам нужно будет изменить пространство имен на то, что вы используете. Метод возвращает строку, поэтому вот пример того, как реализовать ее в вызывающем методе:

bool boolTryAgain = false;

do
{
    string sTextFromUser = PopUpBox.GetUserInput("Enter your text below:", "Dialog box title");
    if (sTextFromUser == "")
    {
        DialogResult dialogResult = MessageBox.Show("You did not enter anything. Try again?", "Error", MessageBoxButtons.YesNo);
        if (dialogResult == DialogResult.Yes)
        {
            boolTryAgain = true; //will reopen the dialog for user to input text again
        }
        else if (dialogResult == DialogResult.No)
        {
            //exit/cancel
            MessageBox.Show("operation cancelled");
            boolTryAgain = false;
        }//end if
    }
    else
    {
        if (sTextFromUser == "cancel")
        {
            MessageBox.Show("operation cancelled");
        }
        else
        {
            MessageBox.Show("Here is the text you entered: '" + sTextFromUser + "'");
            //do something here with the user input
        }

    }
} while (boolTryAgain == true);

Этот метод проверяет возвращаемую строку на наличие текстового значения, пустой строки или "отмены" (метод getUserInput возвращает "отмену", если нажата кнопка отмены) и действует соответственно. Если пользователь ничего не вводил и нажимал "ОК", он сообщит ему и спросит, хотят ли они отменить или повторно ввести свой текст.

Почтовые заметки: В моей собственной реализации я обнаружил, что во всех других ответах пропущено 1 или более из следующего:

  • Кнопка отмены
  • Возможность содержать символы в строке, отправленной в метод
  • Как получить доступ к методу и обработать возвращаемое значение.

Таким образом, я разместил свое собственное решение. Я надеюсь, что кто-то найдет это полезным. Поблагодарите комментаторов Bas и Gideon + за ваш вклад, вы помогли мне найти работоспособное решение!

Ответ 13

Вот пример в 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