我正在开发一个 win 表单应用程序,我发现自己经常需要访问父表单中的方法,例如来自另一个类的 Form1,无论是表单类还是只是一个类。我的 form 1 的构造函数中有一些初始值设定项,因此我无法创建 Form1 的实例。所以我无法访问 Form1 的方法。
所以我觉得这是一个不好的做法。但是,在某些情况下我不知道还能做什么,例如考虑这种情况。我有一个名为 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("text",Label1); 一样调用它
但如果我从另一个类调用它来引用 Label1,我将需要 Form1 的实例,但我无法创建它,那么最好的做法是什么?
(我知道我可以将文本传递给 SetText 并在那里处理控件,但我将对从不同类调用的各种文本框和标签控件使用相同的东西)
我通常执行此操作的方法是让子表单公开与该表单上的逻辑操作和事件相对应的事件,例如:
/// <summary>
/// Occurrs when an item is selected in the form
/// </summary>
public event EventHandler<ItemSelectedEventArgs> ItemSelected;
/// <summary>
/// Fires the <see cref="ItemSelected" /> event
/// </summary>
protected void OnItemSelected(MyItem item)
{
var handler = this.ItemSelected;
if (handler != null)
{
ItemSelectedEventArgs args = new ItemSelectedEventArgs();
args.Item = item; // For example
handler(this, args);
}
}
这个想法是,父表单的逻辑应该响应子表单上的操作,而不是子表单上的操作驱动父表单上的操作 - 您应该尝试尽可能封装表单逻辑(也称为关注点分离) )。
另外,作为一种模式,它应该是父/调用形式,通过以下方式处理将调用编组到正确的线程InvokeRequired
等等...而不是子表单 - 无论如何这都是不必要的,除非您正在后台线程上工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)