c# .net winforms dialog prompt

c# confirm dialog



Prompt Dialog en Windows Forms (11)

Agregue referencia a Microsoft.VisualBasic y utilícela en su código C #:

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

Estoy usando System.Windows.Forms pero, curiosamente, no tengo la capacidad de crearlos.

¿Cómo puedo obtener algo así como un cuadro de diálogo de javascript, sin javascript?

MessageBox es agradable, pero no hay forma de que el usuario ingrese una entrada.


Aquí hay un ejemplo en 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


Basado en el trabajo de Bas Brekelmans anterior, también he creado dos diálogos de derivación -> "entrada" que le permiten recibir del usuario tanto un valor de texto como un booleano (TextBox y 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()); } }

... y texto junto con una selección de una de las múltiples opciones (TextBox y 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()); } }

Ambos requieren los mismos usos:

using System; using System.Windows.Forms;

Llámalos así:

Llámalos así:

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



En general, no es una buena idea importar las bibliotecas de VisualBasic a los programas de C # (no porque no funcionen, sino solo por compatibilidad, estilo y capacidad de actualización), pero puede llamar a Microsoft.VisualBasic.Interaction.InputBox () para mostrar el tipo de caja que estás buscando.

Si puede crear un objeto Windows.Forms, sería lo mejor, pero dice que no puede hacer eso.


La respuesta de Bas Brekelmans es muy elegante en su simplicidad. Pero, descubrí que para una aplicación real se necesita un poco más, como por ejemplo:

  • Crecer de forma apropiada cuando el mensaje de texto es demasiado largo.
  • No aparece automáticamente en el centro de la pantalla.
  • No proporciona ninguna validación de la entrada del usuario.

La clase aquí maneja estas limitaciones: http://www.codeproject.com/Articles/31315/Getting-User-Input-With-Dialogs-Part-1

Acabo de descargar la fuente y copié InputBox.cs en mi proyecto.

Sorprendido, no hay algo aún mejor ... Mi única queja es que el texto de los subtítulos no admite líneas nuevas, ya que usa un control de etiqueta.


La respuesta de Bas puede hacerte temer en memoria teóricamente, ya que ShowDialog no se eliminará. Creo que esta es una forma más adecuada. También mencione que la etiqueta de texto es legible con texto más largo.

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(); } }

Implementación:

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


Microsoft.VisualBasic.Interaction.InputBox tiene varios inconvenientes. ¿Cómo administrar si un usuario hace clic en Aceptar o cancelar? No puedes.

Debería escribir su propia clase o usar algo como InputControl de OOKII Dialogs . OOKII es genial.


Necesita crear su propio cuadro de diálogo Prompt. Tal vez podrías crear una clase para esto.

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 : ""; } }

Y llamándolo:

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

Actualización :

Se agregó el botón predeterminado ( tecla Intro ) y el enfoque inicial en función de los comentarios y otra pregunta .


No existe tal cosa de forma nativa en Windows Forms.

Tienes que crear tu propio formulario para eso o:

utilice la referencia Microsoft.VisualBasic .

Inputbox es un código heredado introducido en .Net para compatibilidad con VB6, por lo que le aconsejo que no lo haga.


Otra forma de hacerlo: suponiendo que tiene un tipo de entrada de cuadro de texto, crear un formulario y tener el valor del cuadro de texto como una propiedad pública.

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(); } }

En la forma principal, este será el código:

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

;

De esta manera, el código se ve más limpio:

  1. Si se agrega la lógica de validación.
  2. Si se agregan otros tipos de entrada.