【问题标题】:Accessing Form object from different class从不同的类访问 Form 对象
【发布时间】:2014-03-25 22:26:48
【问题描述】:

我正在尝试通过单独的类访问表单的 RichTextBox 控件。

在我的表单类中...

    delegate void SetTextCall(string s);

    public void safeCall(string s)
    {
        if (this.richTextBox1.InvokeRequired)
        {
            SetTextCall d = new SetTextCall(safeCall);
            this.Invoke(d, new object[] { s });
        }
        else this.richTextBox1.AppendText("From Applicator");
    }

在不同的班级...

public void getMessages()
    {
        lock (lockObj)
        {
            Dictionary<string, List<string>> result = ScannerMessages
                .GroupBy(k => k.Value)
                .Where(grp => grp.Count() > 1)
                .ToDictionary(grp => grp.First().Key, grp => grp.Skip(1).Select(k => k.Key).ToList());

            if(result.Count > 0)
            {
                foreach(var key in result.Keys)
                {
                    // I want to write to the rich textbox the key and the list accosiated with the key 
                    // in the richtextbox on Form1
                }
             }
        }
    }

我尝试将文本框修改为公开,并尝试修改创建一个静态方法来调用。我不知道该怎么做。

【问题讨论】:

  • 以前,您必须在第二个类中引用第一个表单类对象。
  • 您的“safeCall”方法有什么问题?您应该在表单上引入方法以允许从外部进行操作。直接访问控件不是一个好习惯。

标签: c# forms


【解决方案1】:

您应该将 UI 与业务逻辑分开。这意味着对某些数据执行计算的这个类应该对你的 UI 一无所知,也不应该对表单或其内容一无所知。

相反,它应该简单地返回值,而不是让方法无效。然后您的 UI 可以调用此方法,获取结果,然后处理显示该结果,但它认为这是必要的。

除了更容易之外,它还大大减少了耦合。它可以防止此类仅与一个 UI 相关联,并且允许独立开发 UI 和业务逻辑,而无需任何一方对另一方有深入的了解。这使得开发更容易,它使程序更容易推理,提高可维护性,简化调试等。

【讨论】:

  • 如果不清楚,我很抱歉 - 它们在两个单独的类中 - 我没有发布整个类,只是试图访问richtextbox的部分。如果我将“public void getMessages()”添加到 Form1 类中,它将毫无问题地工作。我的 safeCall 按预期工作。我想要做的是从单独的类中调用 safeCall() 而不实例化另一个 Form1 对象。我不能将 safeCall() 设为静态,否则它会中断。 From1.safeCall() 在其他类中无效。
  • @user3198872 我的回答说明了所有这些要点。这段代码不应该在Form1 中,它应该在另一个类中。它、表单的任何方面或其内容都不应该是静态的。这个方法应该对表单、其中的内容或这些结果应该如何显示一无所知。它应该简单地将结果作为此方法的返回值返回。当表单调用这个方法时,它负责显示结果(如果需要,还负责显示到 UI 线程),而不是这个方法。这就是您将 UI 与业务逻辑分开的方式。
  • 好的,我明白你在说什么。当应用程序的其余部分开始发挥作用时,我的问题就出现了。上面帖子中的消息实际上是在一个参考类中(如“全局”类)。这些对象然后由其他线程填充。然后具有顶部代码段的类是另一个线程,它不断检查这些消息的状态。如果它们发生变化,那么我希望它填充表单。我应该采取什么方向来遵循您所说的?
  • @user3198872 听起来应该在数据更改时触发的非 UI 代码的顶层附近有一个事件,然后 UI 可以订阅该事件并根据这些变化。
猜你喜欢
  • 1970-01-01
  • 2019-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多