На жаль, C # все ще не пропонує цю можливість у вбудованих libs. Найкраще рішення на даний момент - створити спеціальний клас із методом, який вискакує невелику форму. Якщо ви працюєте в Visual Studio, ви можете зробити це, натиснувши на проект> Додати клас
Visual C # items> code> клас
Назвіть клас 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 повертає "скасувати", якщо натиснути кнопку скасування) і діє відповідно. Якщо користувач нічого не ввів і натиснув ОК, він скаже користувачеві і запитає, чи хоче він скасувати або повторно ввести текст.
Примітки до пошти: В моїй власній реалізації я виявив, що в усіх інших відповідях бракує 1 або більше з наступного:
- Кнопка скасування
- Можливість містити символи у рядку, надісланому методу
- Як отримати доступ до методу та обробити повернене значення.
Таким чином, я розмістив власне рішення. Сподіваюся, хтось вважає це корисним. Подяка Базі та Гедеону + коментаторам за ваш внесок, ви допомогли мені придумати дієве рішення!