Диалоговое окно приглашения в Windows Forms
Я использую System.Windows.Forms но как ни странно не имеют возможности для их создания.
Как я могу получить что-то вроде диалогового окна приглашения javascript, без javascript?
MessageBox будет хорошо, но нет никакого способа для пользователя, чтобы ввести.
10 ответов:
вам нужно создать свой собственный диалог приглашения. Вы могли бы создать класс для этого.
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");обновление:
добавлена кнопка по умолчанию (ввести ключ) и первоначальный фокус на основе комментариев и еще вопрос.
добавить ссылку на
Microsoft.VisualBasicи используйте это в своем коде C#:string input = Microsoft.VisualBasic.Interaction.InputBox("Prompt", "Title", "Default", 0, 0);
нет такой вещи изначально в Windows Forms.
вы должны создать свою собственную форму для того или:
использовать
Microsoft.VisualBasicссылка.Inputbox-это устаревший код, введенный в .Net для совместимости с VB6, поэтому я советую этого не делать.
Если вы можете создать Windows.Формирует объект, это было бы лучше всего, но вы говорите, что не можете этого сделать.
другой способ сделать это: Предполагая, что у вас есть тип ввода текстового поля, Создайте форму и получите значение текстового поля в качестве общедоступного свойства.
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();
таким образом, код выглядит чище:
- если добавить логику проверки.
- если добавлены различные другие типы ввода.
ответ Bas может получить вас в memorytrouble теоретически, так как 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; }
основываясь на работе Bas Brekelmans выше, я также создал два вывода - > диалоговые окна "ввод", которые позволяют вам получать от пользователя как текстовое значение, так и логическое (текстовое поле и флажок):
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");
Brekelmans бас очень элегантный в своей простоте. Но, я обнаружил, что для фактического применения требуется немного больше, такие как:
- растите форму соответствующим образом, когда текст сообщения слишком длинный.
- не автоматически всплывает в середине экрана.
- не предусматривает каких-либо проверки данных, вводимых пользователем.
класс здесь обрабатывает эти ограничения: http://www.codeproject.com/Articles/31315/Getting-User-Input-With-Dialogs-Part-1
Я только что загрузил источник и скопировал InputBox.CS в мой проект.
удивлен, что нет ничего лучше, хотя... Моя единственная реальная жалоба заключается в том, что текст заголовка не поддерживает новые строки в нем, поскольку он использует элемент управления label.
вот мой переделанный вариант, который принимает многострочные/один как вариант
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; }
вот пример в 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
Comments