Как я могу получить доступ к MainForm из класса в отдельном проекте? - PullRequest
0 голосов
/ 14 марта 2012

У меня есть два проекта в этом решении: ProjectA и ProjectB.ProjectA является основным начальным проектом и имеет ссылку на ProjectB.

ProjectA имеет файл MainForm.cs, который содержит текстовое поле и основной пользовательский интерфейс.

ProjectB имеет классвнутри Shapes.cs, содержащей определенную структуру, которую мы используем.Shapes.cs содержит событие, которое вызывается, когда пользователь изменяет некоторый текст для этого объекта.

Что мне нужно сделать, это перехватить этот текст и установить текстовое поле в MainForm.cs для этого текста.Есть ли способ, которым мы можем сделать это?По сути, я не вижу ссылки на основную форму внутри Shapes.cs.Я хотел бы сделать что-то вроде этого:

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

, предполагая, что пользователь вводит строку, которая сохраняется в Shape1.Name.Мне нужно перевести его в основную форму.

Я искал другие вопросы, и самым близким лидерством, которое я нашел, был ответ Мэтта Хэмсмита на этот вопрос. Но если это хорошоподход, которому я должен следовать, я не знаю, как назначить обработчик событий в основной форме для события в отдельном классе.Буду признателен за любую помощь.

Спасибо.

1 Ответ

2 голосов
/ 14 марта 2012

Если форма состоит из дочерних элементов управления, она должна прослушивать события в этих элементах управления, а не элементы управления, пытающиеся привести их родителя к определенному типу. Это означает, что ваш контроль будет работать только с этой формой. Это нарушает инкапсуляцию.

Прослушайте подобное событие:

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. Вызвать событие, когда что-то на вашем контроле изменится.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...