我有2个表单ParentForm和一个子表单。在我的父窗体中,我有一个线程监听器,它监听更新ParentForm区域的feed。现在,我有一个ChildForm,它还需要将来自侦听器的数据放在ChildForm的一个区域上。线程监听器使用委托在获取Feed时更新我的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中创建另一个Feed连接,因为这将复制Connection并导致错误。我只想和UpdateLog()
在ChildForm中做的一样。
我正在呼叫ChildForm在父表单上的OnClick
事件上打开并显示它。
// onclick event
ChildForm childForm = new ChildForm();
childForm.Name = ((ListBox)sender).SelectedItem.ToString();
childForm.ShowDialog(this);
这是我打开ChildForm的方式,如何在UpdateLogCallback
或UpdateLog()
我的ChildForm中也有UpdateLog()
方法。
答案 0 :(得分:1)
如果您只是在parnet表单中保留对子表单的引用,则可以从父表单中调用UpdateLog
方法
private void UpdateLog(string strFeed)
{
txtLog.AppendText(strFeed + "\r\n");
_child.UpdateLog(strFeed);
}
编辑:
此外,如果您有许多子表单,您可以拥有它们的集合。只需确保在关闭时将其从列表中删除。
答案 1 :(得分:0)
要么调用两个方法而不是一个方法,要么从父窗体更新方法中调用子窗体更新方法,在我看来 - 在父窗体上的UpdateLogCallback中从父窗体中添加一个事件。因此,任何知道父类的类都可以依赖于整个更新系统。
答案 2 :(得分:0)
从父级共享方法之一并从子级调用方法或从子级共享一种方法并从父级调用它可以解决它
答案 3 :(得分:0)
在创建时将表单设置为不可见。在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