Я делаю приложение в winforms, которое показывает схему в графическом блоке, и мне нужно программно разместить на нем части. Эти части должны быть интерактивными (таким образом, они должны быть пользовательскими элементами управления), а затем запускать соответствующее событие щелчка (щелчок по части должен отображать информацию, уникальную для этой части). Я мог бы сказать, что хочу разместить пользовательские кнопки на своей картинке. Теперь, конечно, мне нужно только одно событие щелчка и изменять отображаемую информацию в соответствии с выбором, хотя я не знаю, как «связать» это событие с каждой созданной кнопкой.

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

Поскольку все чертежи индивидуальны, количество деталей не может быть определено заранее. Возможно ли создание нескольких экземпляров одного и того же элемента управления на ходу? Или есть обходной путь?

-2
zergerge 13 Авг 2014 в 11:19
1
И следуют обычные вопросы. Что ты пробовал? Где уже написан код? Где ты застрял?
 – 
Steve
13 Авг 2014 в 11:21
Если вы хотите «связать» событие click с кнопкой, вы можете просто дважды щелкнуть по ней ( не во время выполнения), и ваш фокус переместится на его событие click.
 – 
Eli
13 Авг 2014 в 11:27
@ Стив: И обычный ответ: я ничего не пробовал в этой конкретной проблеме, потому что не знаю, как это сделать. Добавление других частей кода не поможет вам понять мою проблему. Если вы не смогли его понять, скажите, какой информации вам не хватает, и я отредактирую ее, но код больше не поможет ни вам, ни мне. По сути вопрос, где я застрял, уже записан. Пожалуйста, прочтите внимательно в следующий раз.
 – 
zergerge
13 Авг 2014 в 11:47
Я это знаю;) Прочтите, пожалуйста, мою проблему, она совсем другая.
 – 
zergerge
13 Авг 2014 в 11:47
Небольшое примечание: элементы управления в winforms никогда не удаляются полностью, пока форма не будет закрыта.
 – 
Sayse
13 Авг 2014 в 12:11

1 ответ

Лучший ответ

Если вы используете элементы управления для своих элементов изображения (вы ничего не определяете по координатам щелчка мыши) и каждый элемент изображения связан только с одним элементом управления меню, то я могу предложить вам использовать Tag, чтобы связать соответствующие элементы управления меню:

    public Form1()
    {
        InitializeComponent();

        this.CreatePictureRelatedControls();
    }

    private void CreatePictureRelatedControls()
    {
        Int32 xPictureControls = 50,
            yPictureControls = 50,
            xAssociatedControls = 200,
            yAssociatedControls = 50,
            yMargin = 10;

        Int32 controlWidth = 125,
            controlHeight = 20;


        Int32 controlCount = 3;

        // ---------Associated controls-----------------

        var associatedControls = new Button[controlCount];

        // Loop - creating associated controls
        for (int i = 0; i < associatedControls.Length; i++)
        {
            var associatedButton = new Button()
            {
                Left = xAssociatedControls,
                Top = yAssociatedControls + (i * (controlWidth + yMargin)),
                Width = controlWidth,
                Height = controlHeight,
                Text = String.Format("associated control {0}", i),
                Visible = false
            };

            // Event handler for associated button
            associatedButton.Click += (sender, eventArgs) =>
                {
                    MessageBox.Show(((Control)sender).Text, "Associated control clicked");
                };

            associatedControls[i] = associatedButton;
        }

        // ----------------- Picture controls ---------------
        var pictureControls = new Button[controlCount];

        // Loop - creating picture controls
        for (int i = 0; i < pictureControls.Length; i++)
        {
            var pictureButton = new Button()
            {
                Left = xPictureControls,
                Top = yPictureControls + (i * (controlWidth + yMargin)),
                Width = controlWidth,
                Height = controlHeight,
                Text = String.Format("picture part button {0}", i),
                // Use of tag property to associate the controls
                Tag = associatedControls[i],
                Visible = true
            };

            // Event hadler for picture button
            pictureButton.Click += (sender, eventArgs) =>
                {
                    Control senderControl = (Control)sender;
                    Control associatedControl = (Control)senderControl.Tag;

                    associatedControl.Visible = !associatedControl.Visible;
                };

            pictureControls[i] = pictureButton;
        }


        this.Controls.AddRange(associatedControls);
        this.Controls.AddRange(pictureControls);
    }

P.S. Если вам нужно связать несколько элементов управления, вы можете просто установить свойство Tag для некоторой коллекции:

button.Tag = new Control[] {associated[1], associated[3]};
1
Eugene Podskal 13 Авг 2014 в 12:09