Leider bietet C # diese Funktion in den integrierten Bibliotheken immer noch nicht an. Die derzeit beste Lösung besteht darin, eine benutzerdefinierte Klasse mit einer Methode zu erstellen, mit der ein kleines Formular angezeigt wird. Wenn Sie in Visual Studio arbeiten, können Sie dies tun, indem Sie auf Projekt> Klasse hinzufügen klicken
Visual C # -Elemente> Code> Klasse
Benennen Sie die Klasse PopUpBox (Sie können sie später umbenennen, wenn Sie möchten ) und fügen Sie den folgenden Code ein:
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 auf das ändern, was Sie verwenden. Die Methode gibt eine Zeichenfolge zurück. Hier ist ein Beispiel für die Implementierung in Ihrer aufrufenden Methode:
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 überprüft die zurückgegebene Zeichenfolge auf einen Textwert, eine leere Zeichenfolge oder "Abbrechen" (die Methode getUserInput gibt "Abbrechen" zurück, wenn auf die Schaltfläche Abbrechen geklickt wird) und handelt entsprechend. Wenn der Benutzer nichts eingegeben und auf OK geklickt hat, wird der Benutzer darüber informiert und gefragt, ob er seinen Text abbrechen oder erneut eingeben möchte.
Post Notes: In meiner eigenen Implementierung stellte ich fest, dass allen anderen Antworten mindestens eine der folgenden fehlte:
- 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!