繁体   English   中英

将数据从子窗体发送到父窗体文本框

[英]Sending Data from child form to Parent Form TextBox

我有一个包含名字、姓氏等的“HUD”的父表单。其中一个子 forms 是搜索表单。 当用户从 DataGrid 中显示的结果中选择一个成员时,我希望相关信息填写在 HUD 中。 我创建了一个 HUD class,其中包含每个值的变量和一个名为 UpdateHUD() 的方法。 我不确定如何让这个工作。 我参考了包含 HUD 的父表单的搜索表单,如下所示:

public frmWWCModuleHost _frmWWCModuleHost;

这是我用来嵌入 forms 的代码。 我没有使用 MDI。

 public static void ShowFormInContainerControl(Control ctl, Form frm)
    {
        frm.TopLevel = false;
        frm.FormBorderStyle = FormBorderStyle.None;
        frm.Dock = DockStyle.Fill;
        frm.Visible = true;
        ctl.Controls.Add(frm);
    }

这是我在 Cell 上运行的代码 单击搜索表单。 这是在我尝试实施 HUD class 之前。

private void dgvSearchResults_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        _frmWWCModuleHost = new frmWWCModuleHost();
        _frmWWCModuleHost.tbxHUD_LastName.Text = dgvSearchResults.CurrentRow.Cells[1].FormattedValue.ToString();
        _frmWWCModuleHost.tbxHUD_LastName.Invalidate();
        _frmWWCModuleHost.FormPaint();
    }

提前致谢!

〜帕特里克


编辑


dgvSearchResults_CellContentClick 现在是最新的。 当我逐步执行此代码时,它会在此处获得正确的值,但它永远不会更新实际的 HUD。


编辑 2


我的问题是我声明一个新的 frmWWCModuleHost 而不是将 ref 传递给现有的? 我对此的理解仍然很薄弱。


编辑 3


我通过执行以下操作“解决”了这个问题:在我声明子表单的父表单上,我将作为参数传递。 然后在子窗体的构造函数中添加了 _frmWWCModuleHost = m_parent; 我的父窗体上有一个 UpdateHUD() 方法,我从子窗体的 _CellClick 事件中调用它。

现在改述我的问题; 这样做有什么明显的错误吗?

当子表单搜索完成时,引发“SearchCompleted”事件。 然后任何东西(包括父表单)都可以订阅该事件并检索详细信息。

有关示例,请参见以下 NotepadCode:

class ParentForm
{
    private readonly ChildForm childForm;

    public ParentForm()
    {
        InitializeComponent();

        childForm = new ChildForm();

        childForm.SearchCompleted += childForm_SearchCompleted;
    }

    private void childForm_SearchCompleted(object sender, SearchCompletedEventArgs e)
    {
        // Update the display
        lblName.Text = e.DataToDisplay;
    }
}

class ChildForm
{
    public event EventHandler<SearchCompletedEventArgs> SearchCompleted;

    private void Search(string query)
    {
        // Do the searching

        OnSearchCompleted(new SearchCompletedEventArgs([arg values]));
    }

    public void OnSearchCompleted(SearchCompletedEventArgs args)
    {
        if (SearchCompleted != null)
        {
            SearchCompleted(this, args);
        }
    }
}

在 .NET 中,Forms 与其他所有对象一样,因此您应该从这些方面考虑问题。

这样,子表单将需要访问父表单。 您可以通过构造函数、方法或字段/属性将父表单引用传递给子表单来提供它(尽管构造函数最有意义)。

然后,您可以从孩子更改父表单中的值。

但是我会说这不是最好的主意。 相反,孩子应该公开一个指示数据已更改的事件(以及获取该数据的机制),然后父母应该订阅该事件并在触发时使用数据更新自己。

有时在这种情况下,我会创建一个与我想在父 class 中调用的方法的签名相匹配的委托(我认为在您的情况下是 UpdateHUD),然后传递该委托的实例(即参考到 UpdateHUD)到子表单(在这种情况下为搜索表单)。 当子表单完成接受输入时,它会使用表单上收集的数据调用委托。

因此,假设 UpdateHUD 是父表单中的一个方法,看起来像这样。

private void UpdateHUD(string firstName, string lastName) {
    //...
}

您将创建一个具有相同签名的委托,如下所示。

public delegate void HUDUpdateHandler(string firstName, string lastName);

然后,您将向子表单的构造函数添加 HUDUpdateHandler 参数并将其存储在私有字段中(例如, this.handler = handler )。 当您的子表单准备好将其数据发回时,您将调用子表单的私有字段( this.handler.Invoke(firstNameTextBox.Text, lastNameTextBox.Text) )。 这将使用来自子 class 的值在您的父 class 中调用 UpdateHUD,您不必公开任何内容。

我发现这种方法比引发和捕获事件更容易实现,并且它允许您将父 class 的内部保持在内部。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM