John S Watson Ответов: 1

Не могу рябить пользовательское событие щелчка элемента управления до формы хоста


Я создаю пользовательский элемент управления (называемый видовым окном) с двумя AForge PictureBox и одним ListBox. Три контроля заполнения пользовательских элементов управления.

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

Я уже несколько дней читаю форумы и пробовал бесконечно разные способы. Самое близкое, что у меня есть, показано ниже. Я получаю исключение null object для объекта vpClick.
vpClick(103, this.Name);


Что я уже пробовал:

В пользовательском элементе управления
<pre>using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace FlowerControls
{
    // Add delegate for all control click events
    public delegate void VPClick(int Code, string Title);

    public partial class ViewPort: UserControl
    {
        // Define event from delegate
        public event VPClick vpClick;

:::::
<pre>        private void PictureFlower_Click(object sender, EventArgs e)
        {
            vpClick(101, this.Name);
        }

        private void ListBoxViews_SelectedIndexChanged(object sender, EventArgs e)
        {
            vpClick(102, this.Name);
        }

        private void KeyIcon_Click(object sender, EventArgs e)
        {
            vpClick(103, this.Name);
        }



В форму
// Declare a delegate
public delegate void ViewPort_click(object sender, MouseEventArgs e);


::::
FlowerControls.ViewPort VP01;
int a = 1;
while (a < 7)
{
    VP01 = new FlowerControls.ViewPort();
    //VP01.ContextMenuStrip = contextMenuStripViewPort;
    VP01.Height = viewPortHeight;
    VP01.Width = viewPortHeight;



    //VP01.SizeMode = PictureBoxSizeMode.Zoom;
    VP01.BloomPhoto = Properties.Resources.testpattern; VP01.BorderStyle = BorderStyle.FixedSingle;

    VP01.Location = new Point(I * viewPortHeight, 0);
    I += 1;
    viewports.Add(a, VP01);
    splitContainer2.Panel1.Controls.Add(viewports[a]);

    //viewports[a].Click += new ViewPort_click(object sender, MouseEventArgs e);
    a++;
}


::::
public void ViewPort_click(object sender, MouseEventArgs e)
{
    //do stuff here
    MessageBox.Show("Click");
}

public void vpClick(int Code, string Name) { MessageBox.Show(Name); }

1 Ответов

Рейтинг:
4

OriginalGriff

Видеть здесь: Передача информации между двумя формами, Часть 2: Ребенок-Родитель[^] - он показывает, как передать событие до "родительской формы", но это точно такой же код для UserControl (отчасти потому, что форма является производной от элемента управления).


John S Watson

Спасибо за ответ, он выглядит хорошо.

Это один из постов, которые я прочитал в начале своего поиска, я пропустил его, поскольку он относился к дочерним формам.

Я в пути еще 30 часов. Тогда я попробую сделать это предложение. Если это работает, то обратите внимание, что ваше решение также хорошо подходит для пользовательских элементов управления.

OriginalGriff

Также взгляните на это:
https://www.codeproject.com/Articles/400287/A-simple-code-snippet-to-add-an-event
Он добавляет ярлык для VS, чтобы добавить событие в класс, набрав "evh [TAB][TAB]", и я использую его каждый раз.

John S Watson

Это полное решение.
Он работает для динамически добавляемых пользовательских элементов управления.

Я попытался принять решение и проголосовать за него 5 звезд, но у меня есть только возможность отклонить его, так как это мой первый вопрос, поэтому я не уверен, что происходит.

OriginalGriff

Похоже, ваше "принять" было принято! :смеяться:
Рад, что это сработало для тебя.