2011-03-24 19 views
80

Estoy usando System.Windows.Forms pero extrañamente no tengo la capacidad de crearlos.Cuadro de diálogo de solicitud en Windows Forms

¿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.

+0

¿Se puede publicar un ejemplo de código de lo que estás tratando de hacer? –

+0

¿Qué tipo de información estás buscando? Da un poco más de detalles. [CommonDialog] (http://msdn.microsoft.com/en-us/library/system.windows.forms.commondialog.aspx) mire las clases que lo heredan ¿Alguno de ellos se ve adecuado para usted? –

+13

Es curioso cómo tres personas piden al OP que brinde más detalles y ejemplos de código, pero es bastante claro lo que quiere decir con * "como un diálogo de solicitud de JavaScript" *. –

Respuesta

208

Debe 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:

botón predeterminado Añadido (tecla Intro) y el enfoque inicial en base a observaciones y another question.

+1

¿Cómo se podría extender esto a A) tener un botón cancelar y B) validar el texto en el campo de texto de alguna manera antes de volver? – ewok

+0

@ewok Simplemente cree un formulario, el Diseñador de formularios lo ayudará a diseñarlo de la forma que desee. –

+0

¡Solución agradable y rápida! Acabo de agregar prompt.Height = 150; antes del ShowDialog para obtener todos los controles en la ventana. – werner

15

No hay tal cosa de forma nativa en Windows Forms.

usted tiene que crear su propio formulario para que o bien:

utilizar 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.

+6

+1 para señalar que este es el código heredado para compatibilidad con VB6. – harsimranb

6

En general, no es una buena idea importar las bibliotecas de VisualBasic a programas 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 cuadro que está buscando.

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

+18

¿Por qué no es una buena idea? ¿Cuáles son los posibles problemas de "compatibilidad" y "capacidad de actualización"? Estoy de acuerdo en que hablando "estilísticamente", la mayoría de los programadores de C# preferirían no usar clases de un espacio de nombres llamado 'VisualBasic', pero eso solo está en su cabeza. No hay realidad en ese sentimiento. También sería llamado el espacio de nombres 'Microsoft.MakeMyLifeEasierWithAlreadyImplementedMethods'. –

+3

En general, el paquete Microsoft.VisualBasic está destinado a simplificar la actualización del código de VB 6 únicamente. Microsoft sigue amenazando con dejar de lado permanentemente a VB (aunque esto probablemente nunca suceda), por lo que no se garantiza el soporte futuro para este espacio de nombres. Además, se supone que una de las ventajas de .Net es la portabilidad: el mismo código se ejecutará en cualquier plataforma que tenga instalado .Net framework. Microsoft.VisualBasic, sin embargo, no está garantizado para estar disponible en ninguna otra plataforma (incluido, por lo que vale, .Net móvil, donde no está disponible en absoluto). –

+15

** Incorrecto. ** Ese es el espacio de nombres secundario 'Microsoft.VisualBasic.Compatibility', no el todo. Se incluye mucha funcionalidad "core" en el espacio de nombres 'Microsoft.VisualBasic'; no va a ningún lado Microsoft ha amenazado con "poner fin" a VB 6, no a VB.NET. Han prometido * repetidamente * que no irá a ningún lado. Algunas personas todavía no parecen haber descubierto la diferencia ... –

34

Agregar referencia a Microsoft.VisualBasic y utilizar esto en su código C#: La respuesta de

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

Esto dice' Interacción' no existe en el espacio de nombres 'Microsoft.VisualBasic' –

+0

Para usar este método, debe agregar un referencia a Microsoft.VisualBasic justo como él dijo. Para hacerlo, debe hacer clic con el botón derecho en Referencias en la ventana del Explorador de proyectos, luego Agregar referencia y verificar VisualBasic desde esa lista. – kisslory

+0

esto es un poco mejor que la solución de clase personalizada, ya que es compatible con pantallas de alto ppp –

1

Bas Brekelmans es muy elegante en su simplicidad. Pero encontré que para una aplicación real se necesita un poco más, como:

  • Crezca el formulario de forma adecuada cuando el mensaje de texto sea demasiado largo.
  • No aparece automáticamente en el centro de la pantalla.
  • No proporciona ninguna validación de la entrada del usuario.

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

acabo fuente descargado y InputBox.cs copiados 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.

4

Otra forma de hacerlo: Suponiendo que tiene un tipo de entrada de cuadro de texto, Cree un formulario y tenga 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 limpia:

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

Basado en el trabajo de Bas Brekelmans anteriormente, también han creado dos derivaciones -> cuadros de diálogo de "entrada" que le permiten recibir por parte del usuario tanto un valor de texto y un valor lógico (cuadro de texto y casilla de verificación):

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 las mismas usings:

using System; 
using System.Windows.Forms; 

Llame a ellos, así:

los llaman 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"); 
0

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

Debe escribir su propia clase o usar algo como OOKII Dialogs 'InputControl. OOKII es genial.

-2

He aquí 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 
0

La respuesta de Bas se puede obtener en memorytrouble teóricamente, ya que no se dispondrá ShowDialog. Creo que esta es una forma más adecuada. También mencione que la etiqueta de texto se puede leer 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; 
} 
Cuestiones relacionadas