C#如何订阅用户控件事件/用户控件没有实例名称

Posted

技术标签:

【中文标题】C#如何订阅用户控件事件/用户控件没有实例名称【英文标题】:C# How to subscribe to a UserControl event / UserControl has no instance name 【发布时间】:2021-11-30 21:16:29 【问题描述】:

我创建了一个用户控件,它显示来自 mysql 数据库的数据(任务主题、日期、时间)。

这个 UserControl 将根据任务的数量被创建多次。

我正在像这样创建 UserControl:

        taskSubjectPanel.Controls.Clear();
        DataTable taskdata = new DataTable();
        sql.Connect("JonasW");
        taskdata = sql.GetTasks(username);
        sql.Disconnect();

        if(taskdata.Rows.Count>0)
        
            for (int i = 0; i < taskdata.Rows.Count; i++)
            
                taskSubjectPanel.Controls.Add(new TaskSubject(taskdata.Rows[i][0].ToString(),
                                                              taskdata.Rows[i][1].ToString(),
                                                              taskdata.Rows[i][2].ToString(),
                                                              taskdata.Rows[i][3].ToString(),
                                                              taskdata.Rows[i][4].ToString(),
                                                              taskdata.Rows[i][5].ToString(),
                                                              taskdata.Rows[i][6].ToString()));
            
        
        taskSubjectPanel.Refresh();

它被添加到流程布局面板中。 我创建了一个公共事件和一个公共数据表,我希望在单击 UserControl 时可以访问:

        public event EventHandler TaskSubjectClick;
        public DataTable taskdata;

这就是触发公共事件的地方:

        private void RedirectMouseClick(object sender, EventArgs e)
        
           sql.Connect("JonasW");
           taskdata = sql.GetTaskData(absenderSQL, empfaengerSQL, subjectText.Text, 
           messageSQL, 
           dateText.Text, timeText.Text, finishedSQL);
           sql.Disconnect();
           this.TaskSubjectClick(this, e);
        

因为它没有名字,我如何访问事件和数据表?。

【问题讨论】:

将您的代码分成两部分,并将您的 TaskSubject 实例实际分配给一个局部变量,以便您可以连接其事件并将其添加到 FlowLayoutPanel。 【参考方案1】:

创建自定义事件:

public delegate void TaskSubjectClick(DataTable taskdata);/*<- Put all data you want to pass here*/
public event TaskSubjectClick TaskSubjectClickEvent;

要调用你必须使用的事件调用:

TaskSubjectClickEvent.Invoke(yourdatatable); //Invoke the event and add your data you want to pass

在您的 Mainform 中,您必须按以下方式添加事件:

yourUserControl.TaskSubjectClickEvent += MainForm_TaskSubjectClickEvent;

【讨论】:

以上是关于C#如何订阅用户控件事件/用户控件没有实例名称的主要内容,如果未能解决你的问题,请参考以下文章

C# WinForm 用户控件的自定义事件问题

在C# WinForm应用程序中如何获取当前窗体中被激发的控件名称?

c# 用户自定义控件的问题 winform

c# winform 如何取得用户控件中 的值

C#编写用户自定义控件时,引用web的webservice,提示错误

c# winform .net 为用户控件创建按钮点击事件