BillWoodruff
Если вы используете Windows Forms, рассмотрите две стратегии:
1.Если у вас есть только несколько значений для получения от пользователя, рассмотрите возможность использования скрытой панели на форме (InputPanel.Visible = false) до тех пор, пока вы не захотите показать ее и получить информацию. Или вы можете использовать UserControl таким же образом.
2. Если ваш дизайн требует, чтобы вы "пошли модально" ... чтобы показать всплывающее окно, которое будет блокировать приложение до тех пор, пока оно не будет закрыто ... в C# вам нужно использовать форму. Итак, создайте форму во время разработки, добавив необходимые поля ввода. Затем вам нужно будет найти способ получить входные данные пользователя в запущенное приложение, когда пользователь нажимает кнопку Отправить/ввести или, возможно, когда форма закрыта пользователем.
2. а. как это сделать:
2. a. 1 создайте форму ввода 'InputForm
2.а.2. положить рядом и кнопок на нем, 'btnClose, 'btnSubmit
2. A. 3 Пример кода: предполагается, что вы хотите знать три возможных результата действий пользователя в форме ввода:
а. закрыл ли пользователь форму или отменил ее ?
б. ввел ли пользователь неверные данные
В. ввел ли пользователь действительные данные
Форма ввода данных:"
using System;
using System.Windows.Forms;
namespace YourNameSpace
{
public partial class InputForm : Form
{
public InputForm()
{
InitializeComponent();
}
public Action<bool?, int> ReturnInputFormData { set; get; }
private bool hasData = false;
public void ValidateAndReturnData()
{
if (ReturnInputFormData == null) return;
if (hasData)
{
int data = 0;
bool dataOkay = Int32.TryParse(inputDataTextBox.Text, out data);
ReturnInputFormData(dataOkay, data);
}
else
{
ReturnInputFormData(null, 0);
}
}
private void btnSubmit_Click(object sender, EventArgs e)
{
hasData = inputDataTextBox.Text != string.Empty;
this.Close();
}
private void btnCancel_Click(object sender, EventArgs e)
{
hasData = false;
this.Close();
}
private void InputForm_FormClosing(object sender, FormClosingEventArgs e)
{
ValidateAndReturnData();
}
}
}
Пример того, как это используется в основной форме в кнопке Click EventHandler:
private void GetUserData_Click(object sender, EventArgs e)
{
InputForm inForm = new InputForm();
inForm.ReturnInputFormData = ReturnInputFormData;
inForm.Show();
}
private void ReturnInputFormData(bool? userEntryResult, int i)
{
switch (userEntryResult)
{
case null:
Console.WriteLine("user closed form, or clicked Cancel");
break;
case true:
Console.WriteLine("user entry valid: {0}", i);
break;
case false:
Console.WriteLine("user entered invalid value");
break;
default:
break;
}
}
Примечание:
1. мы использовали, допускающий значение null, возвращаемый параметр типа bool, чтобы различить никаких действий или пустые данные на закрытие форма от Пользователь, нажавший кнопку "Отправить".
... чтобы этот пример кода был коротким ... мы опустили некоторые вещи, которые вы, возможно, захотите обработать в производственном коде ...
2. этот код не обнаруживает/не сообщает что-то вроде того, что пользователь вводит какие-то данные, возможно, действительные данные, а затем закрывает форму, нажав на кнопку Отмена или закрыв окно. в некоторых случаях (наивные пользователи ?) Вы можете захотеть справиться с этим и отправить сообщение, чтобы помочь пользователю.
3. этот код специально не обрабатывает, как отдельный случай, пользователя, ничего не вводящего или очищающего поле ввода текста, а затем нажимающего кнопку Отправить. Я предпочитаю сделать кнопку отправки отключенной по умолчанию и включать ее только тогда, когда в поле ввода есть действительные данные.
BillWoodruff
Я рад, что вы нашли мой ответ полезным. к вашему сведению: использование синтаксиса делегата действия - это способ быстро определить делегата; это эквивалентно написанию:
внутренний делегат void GetInputFormData (bool? результат, int значение);
Делегат, определенный с помощью Action (или Func), является, как и все другие делегаты и события, мульти-приведенным объектом, который может иметь несколько подписчиков (пользователей), совместимые обработчики событий которых соответствуют его типам параметров.
внутренний GetInputFormData ReturnInputFormData { set; get; }
Обычный технический термин, используемый для блока исполняемого кода, вставленного/введенного в другой контекст кода таким образом, что какое-то событие в этом контексте отправляет сообщение и/или возвращает данные в контекст, который вставил/ввел код ... является ... " обратным вызовом"
Что мне нравится в этом способе общения между ними .NET objects заключается в том, что он помогает обеспечить "инкапсуляцию": форма, показанная здесь модально, не имеет "знания" о том, есть ли у нее подписчики на ее обратный вызов, нет доступа к ее подписчикам; она не может испортить объекты, которые она уведомляет, и, если программист попытается заставить обратный вызов возвращать что-либо, кроме допустимых экземпляров типов, которые она определяет, произойдет ошибка времени компиляции.