Visual Studio: связывание пользовательского элемента управления и формы - PullRequest
0 голосов
/ 30 мая 2019

Я создал панель мониторинга, состоящую из двух окон - главного экрана (Форма) и экрана данных (Пользовательский элемент управления). Мой домашний экран является приборной панелью, и после нажатия на кнопку «данные», присутствующую на приборной панели, пользователь отправляется на экран данных (где он вводит свои данные). Я делаю этот переход между двумя окнами, делая экран данных видимым и выводя его на передний план при нажатии кнопки данных.

Q1. Правильный ли это способ переключения окон? Есть ли лучший способ сделать это?

Переходя к основному вопросу, на приборной панели указывается, вводил ли пользователь данные или нет, и если да, отображаются данные пользователя. Код для извлечения пользовательских данных записывается в пользовательский элемент управления. Теперь я хочу отправить эти данные на домашний экран (форму), чтобы данные могли отображаться на приборной панели.

Q2. Как связать пользовательский элемент управления и формы - переменные? Как установить двунаправленную связь между формой и пользовательским элементом управления, т. Е. Пользовательский элемент управления должен уметь читать переменные формы, а форма должна уметь читать переменные пользовательского элемента управления

1 Ответ

1 голос
/ 31 мая 2019

Вот два подхода ...


Плотно связанные

В UserControlA я объявил свойство типа Form1 (родительская форма):

public partial class UserControlA : UserControl
{

    public UserControlA()
    {
        InitializeComponent();
    }

    private Form1 f1;
    public Form1 F1
    {
        get { return f1; }
        set { f1 = value; }
    }

    private void foo()
    {
        if (f1 != null)
        {
            // ... do something with "f1" ...
        }
    }

}

Затем в Form1 я устанавливаю это свойство в событии Load ():

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        userControlA1.F1 = this;
    }

}

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

Используйте этот подход, если между формой и пользовательским контролем существует очень тесная связь, и вполне вероятно, что пользовательский контроль не будет использоваться ни с какими другими формами, ни в каких-либо других сценариях.


Слабосвязанный

В UserControlB я объявил событие (BroadcastName), которое сообщит строку внешнему миру:

public partial class UserControlB : UserControl
{

    public delegate void dlgBroadcastName(UserControlB source, string name);
    public event dlgBroadcastName BroadcastName;

    public UserControlB()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (BroadcastName != null)
        {
            BroadcastName(this, textBox1.Text);
        }
    }

}

Теперь в событии Load () формы Form1 (или с помощью значка молнии на панели свойств) мы подключаем это событие BroadcastName:

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        userControlB1.BroadcastName += UserControlB1_BroadcastName;
    }

    private void UserControlB1_BroadcastName(UserControlB source, string name)
    {
        // ... do something to Form1 with the received information in here ...
    }

}

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

...