К сожалению, C # до сих пор не предлагает эту возможность во встроенных библиотеках. Лучшее решение в настоящее время - создать собственный класс с методом, выводящим небольшую форму. Если вы работаете в Visual Studio, вы можете сделать это, нажав Проект> Добавить класс.
Элементы Visual C #> код> класс
Назовите класс PopUpBox (вы можете переименовать его позже, если хотите) и вставьте следующий код:
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();}
}
}
Вам нужно будет изменить пространство имен на то, что вы используете. Метод возвращает строку, поэтому вот пример того, как реализовать его в вызывающем методе:
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);
Этот метод проверяет возвращаемую строку на наличие текстового значения, пустой строки или «отменить» (метод getUserInput возвращает «отменить», если нажата кнопка отмены) и действует соответственно. Если пользователь ничего не ввел и нажал «ОК», он сообщит пользователю и спросит, хотят ли они отменить или повторно ввести свой текст.
Примечания к публикациям: в моей собственной реализации я обнаружил, что во всех других ответах не хватало одного или нескольких из следующих пунктов:
- Кнопка отмены
- Возможность содержать символы в строке, отправляемой в метод
- Как получить доступ к методу и обработать возвращаемое значение.
Таким образом, я опубликовал собственное решение. Надеюсь, кому-то это пригодится. Благодарим Баса и Гидеона + комментаторов за ваш вклад, вы помогли мне найти работоспособное решение!