代码之家  ›  专栏  ›  技术社区  ›  rob waminal

从父窗体调用子窗体上的方法

  •  0
  • rob waminal  · 技术社区  · 14 年前

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

    我的父窗体有这些。

    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");
    }
    

    ReceivedFeeds() UpdateLog() 将在子窗体中执行。

    编辑

    我正在调用子窗体打开一个 OnClick

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

    这就是我如何打开我的子窗体,以及如何在我的子窗体中调用子窗体内的方法 UpdateLogCallback 更新日志()

    我也有一个 更新日志() 方法。

    4 回复  |  直到 4 年前
        1
  •  1
  •   aqwert    14 年前

    UpdateLog 父窗体中的方法

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

    编辑:

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

        2
  •  0
  •   David Rutten    14 年前

        3
  •  0
  •   KoolKabin    14 年前

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

        4
  •  0
  •   TheVillageIdiot    14 年前

    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