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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# WinForm 用户控件的自定义事件问题相关的知识,希望对你有一定的参考价值。

我的用户控件的事件是这么写的

private void uc_Click(object sender, EventArgs e)

main m = new main();
m.SetInfo();

其中 main 是主窗体,SetInfo() 是主窗体在按下点击事件需要执行的方法例如label.text 赋值等操作。
但是现在的问题是有响应,但是label的text没有在主窗体上显示更改。上网差了很多都说需要委托事件。但是我是个初学者。不是很会。希望大神们能根据我这个给出个代码啥的,具体我不会写。谢谢。

参考技术A 12345private void uc_Click(object sender, EventArgs e) main m = new main(); m.SetInfo();
你这段代码在用户控件里还是在主窗体里?
在主窗体里的话,改成
1234private void uc_Click(object sender, EventArgs e) this.SetInfo();
在用户控件里的话,只能说,你从一开始就错了
参考技术B private void uc_Click(object sender, EventArgs e)
       
           main m = new main();
           m.SetInfo();
       

你这段代码在用户控件里还是在主窗体里?

在主窗体里的话,改成

private void uc_Click(object sender, EventArgs e)
       
           this.SetInfo();
       

在用户控件里的话,只能说,你从一开始就错了

追问

晕了,在控件里,那我需要怎么改?但是在主窗体里面的话也是没有反映啊,求高手指点。在线等

追答

给控件加个属性

public main Parentget;set;
private void uc_Click(object sender, EventArgs e)
       
           if(Parent!=null) Parent.SetInfo();
       


    在主窗体里,给用户控件的Parent属性赋值为this

追问

这个"mian" 是主窗体的名字吗 ? 还是什么? 在主窗体的parent 怎么赋值?
uc.parent = true; 这样?
不好意思麻烦您了

追答

mian是指你主窗体的类名
在调用你的用户控件的主窗体里。假设你的用户控件叫uc ,则 uc.parent =this;

追问

parent =this; 放在主窗体的构造函数里可以吗? 编译的时候出错了
错误 12 “WinForm.ucRoom.Parent.get”必须声明主体,因为它未标记为 abstract 或 extern D:\work\练习V9\WINFORM\ucRoom.cs 18 36 WinForm

您有QQ吗? 我的是307395939

追答

我知道了是你的VS版本比较旧,那个是新版C#的新特性,你改成

main m_parent;//main 还是指你主窗体的类名
public main Parentgetreturn m_parent;setm_parent=value;

我公司网不许用QQ的。

本回答被提问者采纳

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

【中文标题】c# winform .net 为用户控件创建按钮点击事件【英文标题】:c# winform .net create button click event for user control 【发布时间】:2021-08-19 20:08:15 【问题描述】:

我对 c# winform (.net framework) 用户控件有问题。

我有一个“通知”用户控件,其中包含一个按钮和一些信息。 我有一个“今日清单”表格,dinamycal 使用数据库生成 UC。

我不知道如何为按钮创建事件。当我单击一个按钮时,我想从 UC 获取一个信息(标签)。

图片:

UC(我想得到'label2'文本)

生成的 UC

我试过这种方法,但没有:

已编辑:

UC

public event EventHandler<ActionTaskEventArgs> ActionTaskClicked;

        private void button1_Click(object sender, EventArgs e)
        
            string cardid = label2.Text;
            var args = new ActionTaskEventArgs(cardid);
            ActionTaskClicked?.Invoke(this, args);
        

        public class ActionTaskEventArgs : EventArgs
        
            public ActionTaskEventArgs(string taskId)
            
                TaskId = taskId;
            

            public string TaskId  get; 
        

表格

//UC generating:
if (statusz[i] == "Kiadott")
                
                    listItems[i] = new notifications();

                    listItems[i].Title = title[i];
                    listItems[i].Details = details[i];
                    listItems[i].Id = id[i].ToString();
                    listItems[i].Finish = "Ma";
                    listItems[i].BtnTxt = "Kezdés";
                    listItems[i].BtnVisible = true;
                    listItems[i].color = Color.FromArgb(254, 95, 85);

                    flowLayoutPanel1.Controls.Add(listItems[i]);
                    listItems[i].ActionTaskClicked += this.ActionTask_Clicked;

                

//
private void ActionTask_Clicked(object sender, notifications.ActionTaskEventArgs e)
        
            MessageBox.Show(e.TaskId);
        

有人可以帮帮我吗?

现在我得到一个错误:

        void UC_Click(object sender, EventArgs e)
        
            //I gave an error for the below row! Can't convert button type to notifications type i guess.
            notifications obj = (notifications)sender;
            MessageBox.Show(obj.Id);
        

【问题讨论】:

How to know in a Form the name of a Button clicked in a UserControl 如果我生成动态的,如何订阅主窗体中的按钮单击? 我不知道我做错了什么,但并没有真正起作用。我也一样,链接中的内容和您写的内容。但是当我点击按钮时,什么都不做。 我用新代码更新了问题。 我不知道我做错了什么,但现在可以了。非常感谢! 【参考方案1】:

您可以通过定义自定义添加/删除访问器将用户控件的事件“转发”到按钮:

// UC:
public event EventHandler ButtonClick

    add => btn.Click += value;
    remove => btn.Click -= value;

并且在您的主表单中订阅notifications.Click(这似乎是生成的多个孩子的用户控件)。但实际上你应该订阅子控件的ButtonClick

((UC)asd.Controls[0]).ButtonClick += Child0Click;

【讨论】:

我不确定我是否理解这一点,但我也看到你是匈牙利语。你能帮我找个地方吗? 我用更多缺失的部分更新了我的答案 它给我丢了这个错误:'System.InvalidCastException: 'Az objektum nem konvertálható „System.Windows.Forms.Panel” típusról „Retask.forms.notifications” típusra.'' 我应该把你的第二个代码? 当然,我从您的代码中看不到您的控件相互嵌入的深度。但我希望意图是明确的。更优雅的解决方案是在您的 notifications 控件上创建一个 GetChild(int index) 方法,该方法在指定索引处返回 UC

以上是关于C# WinForm 用户控件的自定义事件问题的主要内容,如果未能解决你的问题,请参考以下文章

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

c# winform 制作自定义控件

winform 自定义控件的使用

C#中如何实现WPF调用Winform中用户自定义的控件呢?

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

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