基本上我需要与Form.ShowDialog()提供的相同的东西,但是使用UserControl。
在winform中,我加载了一个UserControl,它允许用户从列表中选择一个项目,并将其返回给调用者。
例如:
var item = myUserControl.SelectItem();
显然,从控件的方法返回非常简单。但是,如何让它等到用户使用控件执行所需的操作?
我可以订阅控件的事件,但这条路径并不理想。
简单地说,我希望UserControl的方法在用户点击其上的特定按钮后返回。
答案 0 :(得分:4)
简单地说,UserControl实际上只是一个自定义控件,就像你在WinFrom上放置TextBox
或ListBox
一样,你将UserControl放在表单上。
对待您的UserControl,就像处理任何其他控件一样,例如TextBox
或ListBox
。
因此,就像您从TextBox
获得TextBox.Text
或SelectedValue
或SelectedItem
ListBox
的价值一样,您可以调用方法从您的UserControl返回SelectedItem。
通常,当单击“确定”按钮或表单关闭时,在代码中,您将通过每个表单的控件获取其值。据推测,您可以进行一些验证以确保输入正确的值。
因此,当您的表单被接受时,您将调用UserControl的方法来获取所选项目。您不必订阅事件以等待该事件发生。再一次,只要像对待正常ListBox
一样对待它。
修改强>
现在更多地了解您问题的性质,这是我的答案:
假设您有一个如下所示的UserControl:
在后面的代码中,您必须设置一个事件来监视何时在UserControl中单击“确定”按钮。此事件还将通知订户用户在列表中选择的选项:
public partial class SelectFromListUserControl : UserControl
{
public class SelectedItemEventArgs : EventArgs
{
public string SelectedChoice { get; set; }
}
public event EventHandler<SelectedItemEventArgs> ItemHasBeenSelected;
public SelectFromListUserControl()
{
InitializeComponent();
}
private void btnOK_Click(object sender, EventArgs e)
{
var handler = ItemHasBeenSelected;
if (handler != null)
{
handler(this, new SelectedItemEventArgs
{ SelectedChoice = listBox1.SelectedItem.ToString() });
}
}
}
在您的主表单上,您将获得与以下内容类似的代码。
事件处理程序将检索在用户控件中选择的值,然后清除用户控件和/或调出另一个用户控件。
private void ShowSelectFromListWidget()
{
var uc = new SelectFromListUserControl();
uc.ItemHasBeenSelected += uc_ItemHasBeenSelected;
MakeUserControlPrimaryWindow(uc);
}
void uc_ItemHasBeenSelected(object sender,
SelectFromListUserControl.SelectedItemEventArgs e)
{
var value = e.SelectedChoice;
ClosePrimaryUserControl();
}
private void MakeUserControlPrimaryWindow(UserControl uc)
{
// my example just puts in in a panel, but for you
// put your special code here to handle your user control management
panel1.Controls.Add(uc);
}
private void ClosePrimaryUserControl()
{
// put your special code here to handle your user control management
panel1.Controls.Clear();
}
答案 1 :(得分:0)
将其嵌入表单并以模态方式调用表单(ShowDialog)?
答案 2 :(得分:0)
但是如何让它等到用户使用控件执行所需的操作?
问题是如何等待用户选择项目并单击“确定”按钮而不阻止整个用户界面。
答案很简单:异步/等待功能。
private readonly SelectCompletionSource as new TaskCompletionSource(of ResultType)
public async function SelectItemAsync() as ResultType
me.Visible = true
return await SelectComplectionSource.Task
end function
public function OK() as boolean
me.Visible = false
dim Result = me.SelectedItem
SelectComplectionSource.
SetResult(Result)
end function
获得Item
一个电话
dim Item = await UserControl.SelectItemAsync
向用户显示 UserControl
,而不会阻止用户界面。选择任务已启动但已暂停,直到结果准备就绪。
通过单击“确定”按钮,用户可以调用OK
查询所选项目的功能,并使选择任务进入完成状态。