Winforms, как заставить два пользовательских элемента управления работать одновременно, запустив любой из них - PullRequest
0 голосов
/ 18 июня 2020

Используя Winforms Я создал пользовательский элемент управления с двумя кнопками, одной меткой и одним просматриваемым свойством.

    private void button1_Click(object sender, EventArgs e)
    {
        label1.Text = "Button1 is clicked";
    }

    private void button2_Click(object sender, EventArgs e)
    {
        label1.Text = "Button2 is clicked";
    }

    public enum Type { StandAlone = 1, Parallel }
    private Type _defaultType = Type.StandAlone;

    [Browsable(true), DisplayName("Type")]
    public Type MyProperty { get { return _defaultType; } set { _defaultType = value; } }

Теперь я добавил 4 из них в свои формы.

Что я Я ожидаю, что если пользователь выберет Parallel для двух из этих пользовательских элементов управления, тогда эти два должны работать одновременно.

Допустим, 4 пользовательских элемента управления названы ucControl1, ucControl2, ucControl3, ucControl4

Если для свойства Type ucControl1 и ucControl2 установлено значение parallel, то во время выполнения, если пользователь нажимает кнопку button1 ucControl1, то button1 ucControl2 также должен запускать событие Click, и наоборот.

Возможно ли такое? Какие у меня есть варианты?

1 Ответ

0 голосов
/ 18 июня 2020

Вы можете обмануть и сохранить список static UserControl в самом UserControl. Добавьте каждый UserControl в список из его конструктора. Затем вы можете перебрать это и попросить каждый параллельный пользовательский элемент управления щелкнуть кнопку с тем же именем. Вот быстрый пример:

public partial class ucControl : UserControl
{

    private static bool suppressRecursion = false;
    private static List<ucControl> ucControls = new List<ucControl>();

    public ucControl()
    {
        InitializeComponent();

        ucControls.Add(this);
        button1.Click += (s, e) => ClickParallelButtons((Button)s);
        button2.Click += (s, e) => ClickParallelButtons((Button)s);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Console.WriteLine("button1 of " + this.Name + " clicked.");            
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Console.WriteLine("button2 of " + this.Name + " clicked.");
    }

    private void ClickParallelButtons(Button btn)
    {
        if (this._defaultType == Type.Parallel && !suppressRecursion)
        {
            suppressRecursion = true;
            foreach (ucControl uc in ucControls)
            {
                if (uc != this && uc._defaultType == Type.Parallel)
                {
                    Control ctlTarget = uc.Controls.Find(btn.Name, true).FirstOrDefault();
                    if (ctlTarget != null && ctlTarget is Button)
                    {
                        ((Button)ctlTarget).PerformClick();
                    }
                }
            }
            suppressRecursion = false;
        }            
    }

    public enum Type { StandAlone = 1, Parallel }
    private Type _defaultType = Type.StandAlone;

    [Browsable(true), DisplayName("Type")]
    public Type MyProperty { get { return _defaultType; } set { _defaultType = value; } }

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