winform c# 动态按钮的事件类

zeoyeah 2017-04-12 11:05:51
现动态生成按钮,但每个按钮的事件相同,都是打开一个新窗口,这个按钮点击事件想做成一个类,请问如何写?代码如下
//添加按钮,frm是新窗口名称,现在不知道如何动态把窗口名称加到button_click事件中
private void AddButtonToPanle(string name, Panel aPanel, Form frm)
{
Button btn = new Button();
btn.Text = name;
btn.Width = aPanel.Width;
btn.Size = new System.Drawing.Size(30,30);
aPanel.Controls.Add(btn);
btn.Click += new EventHandler(Button_Click);
}

//按钮事件
private void Button_Click(object sender, EventArgs e)
{
frm childwin = new frm();
childwin.MdiParent = this;
childwin.Parent = splitContainer1.Panel2;
childwin.Show();
}

调用:
AddButtonToPanle("条码管理", panel2, Frm1);
AddButtonToPanle("条码打印", panel2, Frm2);
...全文
579 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
绿领巾童鞋 2017-04-13
  • 打赏
  • 举报
回复
object sender ,可以通过 sender 强转化为 Button ,然后通过控件 定义 的 Name ,或者实例化的时候 Tag 写标识 来识别是哪个控件。
xdashewan 2017-04-12
  • 打赏
  • 举报
回复
引用 5 楼 zeoyeah 的回复:
Button bt = (Button)sender; var mybtn = Convert.ToString(bt.Tag); 已经可以获得tag的值,但强类型转换有点搞不懂,烦请指点
你传入的时候什么类型,取出来就强转什么类型
xuggzu 2017-04-12
  • 打赏
  • 举报
回复
塞:btn.Tag=frm;
取:Form frm=btn.Tag as Form;取到后最好判读一下,以免出错:if(null==frm) return;
zeoyeah 2017-04-12
  • 打赏
  • 举报
回复
引用 2 楼 xdashewan 的回复:
可以利用Button的Tag属性,事件里强转sender后取tag的值
Button bt = (Button)sender; var mybtn = Convert.ToString(bt.Tag); 已经可以获得tag的值,但强类型转换有点搞不懂,烦请指点
a402485188 2017-04-12
  • 打赏
  • 举报
回复
顶贴666666
stherix 2017-04-12
  • 打赏
  • 举报
回复
你可以继承一个Button 比如
class myButton : Button
{
     public PopupForm Form {get;set;}
}
然后
private void AddButtonToPanle(string name, Panel aPanel, Form frm)
        {
            var btn = new MyButton();
            btn.Text = name;
            btn.Width = aPanel.Width;
            btn.Size = new System.Drawing.Size(30,30);
            btn.PopupForm = frm;
            aPanel.Controls.Add(btn);
            btn.Click += new EventHandler(Button_Click);
        }
        private void Button_Click(object sender, EventArgs e)
        {
            var mybtn = sender as MyButton;
            var childwin = mybtn.PopupForm;
            childwin.MdiParent = this;
            childwin.Parent = splitContainer1.Panel2;
            childwin.Show();
        }
xdashewan 2017-04-12
  • 打赏
  • 举报
回复
可以利用Button的Tag属性,事件里强转sender后取tag的值
zeoyeah 2017-04-12
  • 打赏
  • 举报
回复
每个按钮的Frm不一样
  • 打赏
  • 举报
回复
引用 14 楼 zeoyeah 的回复:
完整的再贴出来: private void AddButtonToPanle(string name, Panel aPanel, string frm) { Button btn = new Button(); btn.Text = name; btn.Width = aPanel.Width; btn.Dock = DockStyle.Top; btn.Size = new System.Drawing.Size(30,30); btn.FlatStyle = FlatStyle.Flat; btn.FlatAppearance.BorderSize = 0; btn.Tag = frm; aPanel.Controls.Add(btn); btn.Click += new EventHandler(Button_Click); } private void Button_Click(object sender, EventArgs e) { Button btn = (Button) sender; Form frm = btn.Tag as Form; if (null != frm) { frm.MdiParent = this; frm.Parent = splitContainer1.Panel2; frm.WindowState = FormWindowState.Maximized; frm.ControlBox = false; frm.FormBorderStyle = FormBorderStyle.None; frm.Show(); } else { MessageBox.Show(btn.Tag.ToString(), "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); } }
写的不错,赞一个
zeoyeah 2017-04-12
  • 打赏
  • 举报
回复
可以了,可能刚才没有把下面的参数全改过来调试
xdashewan 2017-04-12
  • 打赏
  • 举报
回复
引用 27 楼 zeoyeah 的回复:
Code childwin1 = new Code(); Manufacture Childwin2 = new Manufacture(); AddButtonToPanle("条码管理", panel2, childwin1); AddButtonToPanle("条码打印", panel2, Childwin2); 调用前new 还是没效果
debug看下哪里有错,或者没走进去
zeoyeah 2017-04-12
  • 打赏
  • 举报
回复
引用 26 楼 xdashewan 的回复:
[quote=引用 25 楼 zeoyeah 的回复:] 那我后面的调用有没有引号都会报错: AddButtonToPanle("条码管理", panel2, "Code"); 提示参数无效 AddButtonToPanle("条码管理", panel2, Code); 提示Code为类型,当作变量使用
Form childwin = new 你的form();,传childwin进去[/quote] Code childwin1 = new Code(); Manufacture Childwin2 = new Manufacture(); AddButtonToPanle("条码管理", panel2, childwin1); AddButtonToPanle("条码打印", panel2, Childwin2); 调用前new 还是没效果
xdashewan 2017-04-12
  • 打赏
  • 举报
回复
引用 25 楼 zeoyeah 的回复:
那我后面的调用有没有引号都会报错: AddButtonToPanle("条码管理", panel2, "Code"); 提示参数无效 AddButtonToPanle("条码管理", panel2, Code); 提示Code为类型,当作变量使用
Form childwin = new 你的form();,传childwin进去
zeoyeah 2017-04-12
  • 打赏
  • 举报
回复
引用 24 楼 xdashewan 的回复:
[quote=引用 23 楼 zeoyeah 的回复:] private void AddButtonToPanle(string name, Panel aPanel, string frm) { //frm作为AddButtonToPanle参数传进去 }
传Form frm[/quote] 那我后面的调用有没有引号都会报错: AddButtonToPanle("条码管理", panel2, "Code"); 提示参数无效 AddButtonToPanle("条码管理", panel2, Code); 提示Code为类型,当作变量使用
xdashewan 2017-04-12
  • 打赏
  • 举报
回复
引用 23 楼 zeoyeah 的回复:
private void AddButtonToPanle(string name, Panel aPanel, string frm) { //frm作为AddButtonToPanle参数传进去 }
传Form frm
zeoyeah 2017-04-12
  • 打赏
  • 举报
回复
引用 22 楼 xdashewan 的回复:
[quote=引用 21 楼 zeoyeah 的回复:] 后面调用的时候: AddButtonToPanle("条码管理", panel2, "Code"); 这个Code是作为变量传进去的
那你这句btn.Tag = frm;这个fm是从哪里来的[/quote] private void AddButtonToPanle(string name, Panel aPanel, string frm) { //frm作为AddButtonToPanle参数传进去 }
xdashewan 2017-04-12
  • 打赏
  • 举报
回复
引用 21 楼 zeoyeah 的回复:
后面调用的时候: AddButtonToPanle("条码管理", panel2, "Code"); 这个Code是作为变量传进去的
那你这句btn.Tag = frm;这个fm是从哪里来的
zeoyeah 2017-04-12
  • 打赏
  • 举报
回复
引用 20 楼 xdashewan 的回复:
[quote=引用 19 楼 zeoyeah 的回复:] frm 强转后已经是form类型,如何new
AddButtonToPanle传参的时候[/quote] 现在AddButtonToPanle传参的时候是string类型 后面调用的时候: AddButtonToPanle("条码管理", panel2, "Code"); 这个Code是作为变量传进去的
xdashewan 2017-04-12
  • 打赏
  • 举报
回复
引用 19 楼 zeoyeah 的回复:
frm 强转后已经是form类型,如何new
AddButtonToPanle传参的时候
zeoyeah 2017-04-12
  • 打赏
  • 举报
回复
引用 18 楼 xdashewan 的回复:
[quote=引用 17 楼 zeoyeah 的回复:] AddButtonToPanle("条码管理", panel2, "Code"); AddButtonToPanle("条码打印", panel2, "Print"); Code 和 Print 是已经存在的窗体,之前在定义的时候用的是Form frm, 后面改成了string frm
你frm对象new出来没有[/quote] frm 强转后已经是form类型,如何new
加载更多回复(11)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧