实例化一个表单,然后稍后查找,而不是最初显示它

时间:2010-05-04 14:13:31

标签: c# forms show

我遇到的问题对我来说很奇怪,但希望对其他人来说并不那么奇怪。 :)一些背景:我正在开发一个简单的IM客户端,允许用户向多个收件人广播消息。目标是为包含广播消息文本的每个收件人创建聊天表单,然后仅在收件人响应广播者时显示该表单。但是,当应用程序收到响应然后尝试找到该特定聊天会话的表单(使用Application.OpenForms)时,它无法找到它,除非我在创建它时显示。我想避免在创建时显示此表单,因为这意味着用户将在屏幕上看到闪存。在我显示之前,表单似乎不会真正创建,但似乎必须有一种方法可以在不首先显示的情况下执行此操作。有人可以帮忙吗?

如果需要,我可以提供代码片段,我没有在这篇文章中,因为这对我来说更像是一个概念上的误解而不是代码中的错误。提前谢谢!

4 个答案:

答案 0 :(得分:2)

不是将表单用作基类,而是以其他方式执行,创建可以引用表单的类。这样,你就可以让班级了解内容,并将其反映在表格上(如果已经初始化),而不是反过来。 您不应该依赖Forms作为对象的基础。使用Application.OpenForms 应该是不必要的。

public class Contact
{
    string displayname = String.Empty;
    List<Message> history = new List<Message>();
    MessageForm theform = new MessageForm(this);

    public void OnEvent(Message msg)
    {
        if(msg.Sender != me && !theform.Visible)
            theform.Show();

    }

    public void Tell(string message)
    {
    }

}

将您的联系人保留在某种列表中,事情应该相对简单。 (请注意,Windows窗体不是线程安全的,如果您尝试更改来自与main不同的线程的任何控件的任何属性,则会抛出异常)

答案 1 :(得分:0)

windows窗体有Hide(),Show()和Activate()等方法。使用这些方法来解决您的问题。

答案 2 :(得分:0)

为什么不在聊天会话中存储对表单的引用,并在需要显示表单时使用该引用来调用.Show()

session.form.Show();

然后,您可以在不显示表单的情况下创建表单,并且每次要引用它时都没有调用Application.OpenForms的开销。

我知道这是显而易见的,但是OpenForms找不到一张未显示的表格,因为它没有打开。

答案 3 :(得分:0)

由于在显示表单之前不会创建表单句柄,因此您可以手动分配表单句柄:

mf = new MainForm();

        /* Need to assign a handle to MainForm instance manually
         as handle does not get created until form is shown */
        IntPtr handle = mf.Handle;