【问题标题】:Calling a method on a child form from the parent form从父窗体调用子窗体上的方法
【发布时间】:2010-07-19 07:45:17
【问题描述】:

我有 2 个表单 ParentForm 和一个子表单。在我的父表单中,我有一个线程侦听器,它侦听更新 ParentForm 区域的提要。现在,我有一个 ChildForm,它还需要将来自侦听器的数据放置在 ChildForm 的一个区域上。线程侦听器在获取提要时使用委托来更新我的 ParentForm。

我的 ParentForm 有这些。

private delegate void UpdateLogCallback(string strFeed);
private Thread thr;

private void InitializeFeed()
{
    ...
    // Get the feed connection
    ...
    thr = new Thread(new ThreadStart(ReceivedFeeds));
    thr.Start();
}

private void ReceivedFeeds()
{
    string strFeed = GetFromStream();
    
    // invoke my updater while connected
    while(Connected)
    {
        this.Invoke(new UpdateLogCallback(this.UpdateLog), new object[] { strFeed });
    }
}

private void UpdateLog(string strFeed)
{
    txtLog.AppendText(strFeed + "\r\n");
}

这很好用,现在问题来了。当我从 ParentForm 打开 ChildForm 时,我还想使用从 ParentForm 中的 ReceivedFeeds() 获得的内容更新该表单的一部分,我将如何实现这一点?我无法在 ChildForm 中创建另一个提要连接,因为这会复制连接并导致错误。我只想和UpdateLog() 在 ChildForm 中做的一样。

编辑

我正在调用 ChildForm 在父表单上的 OnClick 事件上打开并显示它。

// onclick event
ChildForm childForm = new ChildForm();
childForm.Name = ((ListBox)sender).SelectedItem.ToString();
childForm.ShowDialog(this);

这是我打开 ChildForm 的方式,以及如何在 UpdateLogCallbackUpdateLog() 中调用 ChildForm 中的方法

我的 ChildForm 中还有一个 UpdateLog() 方法。

【问题讨论】:

    标签: c# winforms delegates multithreading


    【解决方案1】:

    如果您只是在 Parnet 表单中保存对子表单的引用,您可以从父表单调用 UpdateLog 方法

    private void UpdateLog(string strFeed)
    {
        txtLog.AppendText(strFeed + "\r\n");
        _child.UpdateLog(strFeed);
    }
    

    编辑:

    此外,如果您有许多子表单,您可以拥有它们的集合。只需确保在它们关闭时将它们从列表中删除即可。

    【讨论】:

    • 谢谢,我是这样实现的。但是如果我有多个 ChildForm 的引用,就像它们可以同时打开一样,我需要更新特定的 ChildForm。我将如何在表单集合中查找它们?
    • 取决于你的匹配条件。可能最好在子表单 UpdateLog 方法中进行检查以确定这一点,因为它比让父表单弄清楚
    【解决方案2】:

    要么调用两个方法而不是一个方法,要么从父窗体更新方法中调用子窗体更新方法,-在我看来最好-向父窗体添加一个事件,该事件是从父窗体的 UpdateLogCallback 中引发的。因此,任何知道父表单的类都可以在整个更新系统上搭载。

    【讨论】:

    • 您好,感谢您的回复,我已经更新了我的问题。鉴于上述附加信息,我如何实现您的建议?
    【解决方案3】:

    从父级共享一个方法并从子级调用它或从子级共享一个方法并从父级调用它都可以解决它

    【讨论】:

      【解决方案4】:

      在创建时设置表单不可见。在 ctor 中写入以下内容(就在 InitializeComponents() 之后):

      Visible = false;
      

      现在在子窗体中添加一个方法,如下所示:

      internal void ShowForm(Form parent)
      {
          var p = parent as Form1;
          if (p != null)
          {
              p.DataReady += (s, ev) =>
              {
                  //update your data here
              };
          }
          ShowDialog(parent);
      }
      

      在父表单中声明这样的事件:

      internal event EventHandler<EventArgs> DataReady;
      

      根据您将数据传递给子表单的需要,您可能需要创建自定义类处理表单EventArgs。像这样显示子窗体:

      var f=new ChildForm();
      f.ShowForm(this);//this is parent form
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多