用户操作后从usercontrol返回值

时间:2013-06-27 18:19:44

标签: c# .net winforms user-controls

基本上我需要与Form.ShowDialog()提供的相同的东西,但是使用UserControl。

在winform中,我加载了一个UserControl,它允许用户从列表中选择一个项目,并将其返回给调用者。

例如:

var item = myUserControl.SelectItem();

显然,从控件的方法返回非常简单。但是,如何让它等到用户使用控件执行所需的操作?

我可以订阅控件的事件,但这条路径并不理想。

简单地说,我希望UserControl的方法在用户点击其上的特定按钮后返回。

3 个答案:

答案 0 :(得分:4)

简单地说,UserControl实际上只是一个自定义控件,就像你在WinFrom上放置TextBoxListBox一样,你将UserControl放在表单上。

对待您的UserControl,就像处理任何其他控件一样,例如TextBoxListBox

因此,就像您从TextBox获得TextBox.TextSelectedValueSelectedItem ListBox的价值一样,您可以调用方法从您的UserControl返回SelectedItem。

通常,当单击“确定”按钮或表单关闭时,在代码中,您将通过每个表单的控件获取其值。据推测,您可以进行一些验证以确保输入正确的值。

因此,当您的表单被接受时,您将调用UserControl的方法来获取所选项目。您不必订阅事件以等待该事件发生。再一次,只要像对待正常ListBox一样对待它。

修改

现在更多地了解您问题的性质,这是我的答案:

假设您有一个如下所示的UserControl:

SelectFromListUserControl

在后面的代码中,您必须设置一个事件来监视何时在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() });
        }
    }
}

在您的主表单上,您将获得与以下内容类似的代码。

  1. 应该有一个例程来创建或使这个特殊的用户控件可见。
  2. 它会将事件挂钩到用户控件中,以便通知主表单。
  3. 它将绘制用户控件。
  4. 事件处理程序将检索在用户控件中选择的值,然后清除用户控件和/或调出另一个用户控件。

    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查询所选项目的功能,并使选择任务进入完成状态。