我正在开发一个win窗体应用程序,并且我发现自己经常需要访问父窗体中的方法,比如来自另一个窗体的Form1,上课或只是一堂课。我有我的表单1的构造函数中的一些初始化器,因此我无法创建Form1的实例。所以我无法访问Form1的方法。调用父窗体中的方法并访问父窗体中的gui元素的最佳实践#
所以我觉得这是一个不好的做法。但是,有些情况下我不知道还有什么可以考虑的情况。我有一个名为ProcessData的类,其中我有一个接收文件的方法,逐行读取并处理数据。现在我将这个方法作为我主窗体Form1中的一个线程调用。我的要求是我想要在主窗体Form1的多行文本框中显示当前正在处理的行的数据过程。
以前我做什么我都在同一Form1中拥有了一切,所以我用一个代表,像
delegate void SetTextCallback(string text, Control ctrl);
private void SetText(string text, Control ctrl)
{
if (ctrl.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text, ctrl });
}
else
{
if (ctrl.GetType() == typeof(Label))
{
ctrl.Text = text;
}
else
{
ctrl.Text += Environment.NewLine + text;
}
}
}
,我调用此类似的setText(“文本”,Label1的);
但是如果我从另一个类中调用它来引用Label1我需要Form1的一个实例,但我无法创建它,那么最佳做法是什么?
(我知道我可以只通过文字的setText和处理控制那里,但我会用同样的事情为各种不同阶层调用文本框和标签控件)
如果您使用的是WPF,命令将是一个不错的选择,但是......在任何情况下,孩子都应该“分离”或不需要父母的知识。这不仅仅是一个重用的事情,它使得错误更容易避免和修复。 – Jodrell 2011-05-16 11:52:47
如果你真的不想使用事件,因为wahtever的原因。孩子应该声明委托类型并接受一个实例作为参数;父代可以实现代理并将实例传递给子代,则线程检查应该位于父代中。就像写你自己的事件一样。我不是在建议这个答案。 – Jodrell 2011-05-16 12:01:18