it-swarm.com.de

Eingabeaufforderungsdialogfeld in Windows Forms

Ich benutze System.Windows.Forms, habe aber seltsamerweise nicht die Möglichkeit, sie zu erstellen.

Wie bekomme ich so etwas wie ein Javascript-Eingabeaufforderungsdialogfeld ohne Javascript?

MessageBox ist Nizza, aber der Benutzer hat keine Möglichkeit, eine Eingabe einzugeben.

94
user420667

Sie müssen ein eigenes Eingabeaufforderungsdialogfeld erstellen. Sie könnten vielleicht eine Klasse dafür erstellen.

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

Und es nennen:

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

Update:

Standardschaltfläche hinzugefügt (Eingabetaste) und anfänglicher Fokus basierend auf Kommentaren und einer anderen Frage .

239
Bas

Fügen Sie einen Verweis auf Microsoft.VisualBasic hinzu und verwenden Sie diesen in Ihrem C # -Code:

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

In Windows Forms gibt es nichts nennenswertes.

Sie müssen dafür ein eigenes Formular erstellen oder:

verwenden Sie die Microsoft.VisualBasic-Referenz.

Bei Inputbox handelt es sich um älteren Code, der zur Kompatibilität mit VB6 in .Net eingebracht wurde. Ich empfehle Ihnen, dies nicht zu tun.

15
Marino Šimić

Es ist im Allgemeinen keine wirklich gute Idee, die VisualBasic-Bibliotheken in C # -Programme zu importieren (nicht, weil sie nicht funktionieren, sondern nur aus Kompatibilitäts-, Stil- und Aktualisierungsmöglichkeiten). Sie können jedoch Microsoft.VisualBasic.Interaction.InputBox () aufrufen. um die Art von Box anzuzeigen, nach der Sie suchen.

Wenn Sie ein Windows.Forms-Objekt erstellen können, wäre das am besten, aber Sie sagen, dass Sie dies nicht tun können.

7
Sean Worle

Eine andere Möglichkeit, dies zu tun: Angenommen, Sie haben einen Eingabetyp TextBox Erstellen Sie ein Formular und den Textfeldwert als öffentliche Eigenschaft.

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

Im Hauptformular wird dies der Code sein:

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

;

Auf diese Weise sieht der Code sauberer aus:

  1. Wenn Validierungslogik hinzugefügt wird.
  2. Wenn verschiedene andere Eingabetypen hinzugefügt werden.
4
user2347528

Basierend auf der Arbeit von Bas Brekelmans oben habe ich auch zwei Ableitungen erstellt -> "Eingabe" -Dialogfelder, in denen Sie vom Benutzer sowohl einen Textwert als auch einen Booleschen Text (TextBox und CheckBox) erhalten können:

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

... und Text zusammen mit einer Auswahl mehrerer Optionen (TextBox und 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());
    }
}

Beide erfordern die gleichen Verwendungen:

using System;
using System.Windows.Forms;

Nenne sie so:

Nenne sie so:

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");
2
B. Clay Shannon

Die Antwort von Bas kann Sie theoretisch in Gedächtnisproblemen bringen, da ShowDialog nicht abgeworfen werden kann.

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

Implementierung:

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

Die Antwort von Bas Brekelmans ist in seiner Schlichtheit sehr elegant. Ich fand jedoch, dass für eine tatsächliche Anwendung etwas mehr benötigt wird, wie zum Beispiel:

  • Vergrößern Sie das Formular entsprechend, wenn der Nachrichtentext zu lang ist.
  • Wird nicht automatisch in der Mitte des Bildschirms angezeigt.
  • Bietet keine Überprüfung der Benutzereingaben.

Die Klasse behandelt diese Einschränkungen: http://www.codeproject.com/Articles/31315/Getting-User-Input-With-Dialogs-Part-1

Ich habe gerade die Quelle heruntergeladen und InputBox.cs in mein Projekt kopiert.

Überrascht ist da allerdings nicht noch etwas Besseres. Mein einziger Kritikpunkt ist, dass der Untertiteltext keine Zeilenumbrüche unterstützt, da er ein Label-Steuerelement verwendet.

1
blak3r

Leider bietet C # diese Funktion in den eingebauten Bibliotheken noch nicht an. Derzeit ist es am besten, eine benutzerdefinierte Klasse mit einer Methode zu erstellen, die ein kleines Formular anzeigt. Wenn Sie in Visual Studio arbeiten, können Sie dies durch Klicken auf Projekt> Klasse hinzufügen tun

 Add Class

Visual C # Elemente> Code> Klasse  Add Class 2

Benennen Sie die Klasse PopUpBox (Sie können sie später umbenennen, wenn Sie möchten) und den folgenden Code einfügen:

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

Sie müssen den Namespace in den von Ihnen verwendeten Namen ändern. Die Methode gibt eine Zeichenfolge zurück, hier also ein Beispiel, wie sie in Ihrer aufrufenden Methode implementiert werden kann:

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

Diese Methode prüft die zurückgegebene Zeichenfolge auf einen Textwert, eine leere Zeichenfolge oder "cancel" (die getUserInput-Methode gibt "cancel" zurück, wenn auf die Schaltfläche "Abbrechen" geklickt wird) und wirkt entsprechend. Wenn der Benutzer nichts eingegeben hat und auf OK geklickt hat, sagt er dem Benutzer und fragt ihn, ob er den Text abbrechen oder erneut eingeben möchte.

Post-Notizen: In meiner eigenen Implementierung habe ich festgestellt, dass bei allen anderen Antworten eine oder mehrere der folgenden Antworten fehlten:

  • Eine Abbrechen-Schaltfläche
  • Die Fähigkeit, Symbole in der an die Methode gesendeten Zeichenfolge zu enthalten
  • Zugriff auf die Methode und Behandlung des zurückgegebenen Werts.

Daher habe ich meine eigene Lösung veröffentlicht. Ich hoffe jemand findet es nützlich. Dank an Bas und Gideon + Kommentatoren für Ihre Beiträge. Sie haben mir geholfen, eine praktikable Lösung zu finden! 

0
technoman23

hier ist meine überarbeitete Version, die Multiline/Single als Option akzeptiert

   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;
        }
0
Alper Ebicoglu