如何从单独项目中的类中访问MainForm?

时间:2012-03-14 03:30:28

标签: c# winforms forms events event-handling

我在这个解决方案中有两个项目:ProjectA和ProjectB。 ProjectA是主要的启动项目,并且引用了ProjectB。

ProjectA有一个名为MainForm.cs的文件,其中包含一个文本框和主UI。

ProjectB在Shapes.cs中有一个类,包含我们正在使用的特定结构。 Shapes.cs包含当用户更改该对象的某些文本时触发的事件。

我需要做的是捕获该文本并将MainForm.cs中的文本框设置为该文本。有没有办法可以做到这一点?基本上我没有看到Shapes.cs中的主要表单的任何引用。我想做这样的事情:

( Shape1.Parent as MainForm ).TextBox1.Text = Shape1.Name;

,假设用户键入一个存储在Shape1.Name中的字符串。我需要将其升级为主要形式。

我一直在寻找其他问题,我找到的最接近的线索是Matt Hamsmith对this question.的答案但是如果这是一个很好的方法我应该遵循,我不知道如何分配一个事件处理程序主要表单到单独的类中的事件。我将不胜感激任何帮助。

感谢。

1 个答案:

答案 0 :(得分:2)

如果表单由子控件组成,则应该监听这些控件上的事件,而不是试图将其父级转换为特定类型的控件。这样做意味着您的控件只能在该表单上运行。它破坏了封装。

听取这样的事件:

public class MainForm : Form
{
    Shape _shape1 = new Shape();

    public MainForm()
    {
        InitializeComponent();
        _shape.ShapeNameChanged += HandleShapeNameChanged;
    }

    public void HandleShapeNameChanged(object sender, ShapeChangeEventArgs e)
    {
        textBox1.Text = e.NewName;
    }
}

public class Shape
{
    public event EventHandler<ShapNameChangedEventArgs> ShapeNameChanged;
}

我已经把它留给了你:

  1. 定义ShapeNameChangedEventArgs对象以包含您想要的任何状态。
  2. 当控件上的某些内容发生变化时调用该事件。
  3. 祝你好运!