【问题标题】:Accessing new form instances c#访问新的表单实例 c#
【发布时间】:2012-10-05 10:20:14
【问题描述】:

我正在用 C# 编写一种即时通讯应用程序,它适用于套接字。我管理了所有套接字问题,它现在就像 IRC 一样工作。但是,我想实现私人消息系统。我们有两种形式——一种是主要的,第二种是类似私人味精的原型。窗口应该看起来像。这是我的问题:

string priv_windows, who, msg;

...

public void createform(string who, string msg)
{
Form2 frm = new Form2();
frm.Text = who;
frm.label1.Text = msg;
priv_windows += who += " ";
frm.Show();
}

...

createform("1st instance", "some text");
createform("2nd instance", "other text");

这对于创建新的表单实例非常有效,但是在创建它们之后我找不到与这些子表单进行通信的方法。我的意思是,例如,我如何更改第一个表单实例上的文本? 有没有一种简单的方法可以为特定的表单实例设置索引或其他内容?请稍后描述如何使用它。

【问题讨论】:

    标签: c# windows winforms multiple-forms


    【解决方案1】:
    public class Form2 : System.Windows.Forms.Form
    {
        public System.Windows.Forms.Label label1 = new System.Windows.Forms.Label();
    
        public void Main(string args[])
        {
            Form2 first = createform("1st instance", "some text");
            Form2 second = createform("2nd instance", "other text");
        }
    
        public Form2 createform(string who, string msg)
        {
            Form2 frm = new Form2();
            frm.Text = who;
            frm.label1.Text = msg;
            priv_windows += who += " ";
            frm.Show();
            return frm;
        }
    
        public void SetMessage(string message)
        {
            this.label1.Text = message;
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果我解释 void CreateForm(String, String) 的参数 who 是对的,你希望与某个人的每次活动对话都有一个私人窗口。

      如果这是正确的,我将使用类Dictionary(有关详细信息,请参阅MSDN)而不是List 来保存对对话窗口的引用。

      另一件好事是实现一个表单控制器类,它实际上具有静态成员来管理所有使用的表单。这将允许您在代码中的任何位置访问窗口窗体。如果您不希望代码的每个部分都可以访问它,您可以使用命名空间来控制可访问性。

      【讨论】:

      • 谢谢。这是最好的方法。
      【解决方案3】:

      您可以创建一个列表并将表单保存在其中,例如,

      private List<Form2> forms = new List<Form2>();
      
      public void createform(string who, string msg)
      {    
          Form2 frm = new Form2();
          forms.Add(frm);
          // etc
      

      现在您可以访问列表中的每个表单:

      foreach (Form2 form in forms)
      {
          form.Text = "Hello world";
      }
      

      【讨论】:

        【解决方案4】:

        使用任何集合来存储和引用您的表单实例

        【讨论】:

          【解决方案5】:

          您需要保留对它的引用,以便与他们“交流”。像你的字符串这样的私有变量,例如:

          string priv_windows, who, msg;
          List<Form> forms = new List<Form>();
          
          public void createform(string who, string msg)
          {    
              Form2 frm = new Form2();
              frm.Text = who;
              frm.label1.Text = msg;
              priv_windows += who += " ";
              forms.Add(frm);
              frm.Show();
          }
          
          public void ChangeChild()
          {
              Form f = forms[0];
              f.Text = "New Form Title Text";
          }
          

          这只是一个操作集合中第一个表单的简单示例,如果您有很多表单,则需要一种更复杂的方法来确定要更改哪个检索哪个表单。

          【讨论】:

            【解决方案6】:

            我建议使用event aggregator 与您域中的对象进行通信。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-03-26
              • 1970-01-01
              • 2010-09-08
              • 1970-01-01
              • 2015-08-13
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多