我无法相信,这在我的其他应用程序中有效,但在这个有类似结构的应用程序中 - 它没有!
public string ListAdd
{
set
{
if (listView1.InvokeRequired)
{
this.Invoke((MethodInvoker)delegate
{
listView1.Items.Add(value);
});
}
else
{
listView1.Items.Add(value);
}
}
}
我称之为:
var formz = Form.ActiveForm as Form1;
if (formz != null)
formz.ListAdd = "asdasdasdasd";
如果我从接收数据包的函数(我希望将它放在listView上)通过TCP调用它 - 没有任何事情发生,但是如果我在同一个类中调用它来初始化WinSock - 它可以工作。
问题出在哪里?
修改 我只是调试了应用程序,formz在我称之为的地方为null(接收函数)。 为什么它在那里是空的,但在其他任何地方都没有?
答案 0 :(得分:2)
我不认为,它会解决您的问题,但您是否考虑过使用以下模式进行调用?我认为它更具可读性。创建此扩展方法。
public static class ControlExtension
{
public static void ThreadSafeInvoke(this Control control, MethodInvoker method)
{
if (control != null)
{
if (control.InvokeRequired)
{
control.Invoke(method);
}
else
{
method.Invoke();
}
}
}
}
然后你可以执行这样的线程安全方法调用。
Form form = new Form();
form.ThreadSafeInvoke(() => form.Text = "ThreadSafeInvoke");
或一次多次通话。
form.ThreadSafeInvoke(() =>
{
form.Text = "ThreadSafeInvoke";
form.Visible = true;
form.WindowState = FormWindowState.Maximized;
});
<强>更新强>
所以问题显然是Form.ActiveForm
返回null
。
答案 1 :(得分:1)
如果ActiveForm返回null,那么您可能没有活动表单,或者它不是Form1类型。你正在使用“as Form1”,所以如果你有一个活跃的Form2,那么formz将被设置为null。
你能将formz传递给函数而不是调用ActiveForm吗?
答案 2 :(得分:0)
检查您是否处于调试模式;如果是这样,则返回的活动表单值将为null。