标题:C#如何动态创建控件?在winform中怎么使用代码来创建控件并添加控件事件啊? ...
只看楼主
卡巴斯
Rank: 2
等 级:论坛游民
帖 子:50
专家分:31
注 册:2012-12-18
结帖率:100%
已结贴  问题点数:10 回复次数:4 
C#如何动态创建控件?在winform中怎么使用代码来创建控件并添加控件事件啊?
另外这段代码有没有更好的写法?我想让控件在窗口中排成一个3*3的格式
程序代码:
private void 布局()
        {
            Button[] bu = { button1, button2, button3, button4,button5,button6,button7,button8,button9};
            foreach (Button but in bu)
            {
                but.Top = 0;
                but.Left = 0;
                but.Height = 100;
                but.Width = 100;
                but.Cursor = Cursors.Hand;
            }
            for (int i = 0; i < 3;i++ )
            {
                bu[i].Left = i<=0?0:bu[i-1].Left+bu[i].Width;
            }
            for (int i = 3; i < 6;i++ )
            {
                bu[i].Top = bu[i].Height;
                bu[i].Left = i <= 3 ? 0 : bu[i - 1].Left+bu[i].Width;
            }
            for (int i = 6; i < 9;i++ )
            {
                bu[i].Top = bu[i].Height * 2;
                bu[i].Left = i <= 6 ? 0 : bu[i - 1].Left+bu[i].Width;
            }
        }
如果我要使用代码来创建的话要怎么写啊?
搜索更多相关主题的帖子: color 动态 如何 
2013-04-02 13:12
mrhan1991
Rank: 2
等 级:论坛游民
威 望:1
帖 子:13
专家分:50
注 册:2013-4-2
得分:2 
我把自己写的代码贴给你,不知道会不会对你有帮助

        private void button1_Click(object sender, EventArgs e)
        {
            RemoveControl();

            int P_int_x=10;
            int P_int_y=10;

            for (int i = 0; i < 100; i++)
            {
                Button btn = new Button();
                btn.Text = (i + 1).ToString();
                btn.Name = "btn" + (i + 1).ToString();
                btn.Width = 40;
                btn.Height = 20;
                btn.Location = new Point(P_int_x, P_int_y);
                P_int_x+=50;
                if (((i + 1) % 10) == 0)
                {
                    P_int_x = 10;
                    P_int_y += 25;
                }
                btn.Click+=new EventHandler(btn_Click);
                this.panel1.Controls.Add(btn);
            }
        }

Coding is life !
2013-04-02 13:35
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
得分:8 
FlowLayoutPanel flowLayoutPanel1 = new FlowLayoutPanel();
for (int i = 0; i < 9; i++)
{
    Button btn = new Button();
    btn.Height = 100;
    btn.Width = 100;
    btn.Cursor = Cursors.Hand;  
    btn.Name = btn.Text = "button" + (i + 1);

    flowLayoutPanel1.Dock = DockStyle.Left;
    flowLayoutPanel1.Width = 330;
    flowLayoutPanel1.Controls.Add(btn);
}
this.Controls.Add(flowLayoutPanel1);
2013-04-02 14:01
卡巴斯
Rank: 2
等 级:论坛游民
帖 子:50
专家分:31
注 册:2012-12-18
得分:0 
回复 3楼 yhlvht
版主大大能解释一下代码吗?有的地方看不明白
程序代码:
FlowLayoutPanel flowLayoutPanel1 = new FlowLayoutPanel();//为什么要添加这样一个控件?
for (int i = 0; i < 9; i++)
{
    Button btn = new Button();
    btn.Height = 100;
    btn.Width = 100;
    btn.Cursor = Cursors.Hand; 
    btn.Name = btn.Text = "button" + (i + 1);

    flowLayoutPanel1.Dock = DockStyle.Left;//这个又是什么意思啊?
    flowLayoutPanel1.Width = 330;
    flowLayoutPanel1.Controls.Add(btn);//
}
this.Controls.Add(flowLayoutPanel1);//为什么要使用这个添加?
另外我要添加事件并且要添加事件响应的代码该怎么写啊?
2013-04-02 21:50
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
得分:0 
FlowLayoutPanel flowLayoutPanel1 = new FlowLayoutPanel();//为什么要添加这样一个控件?
FlowLayoutPanel是一个用于自动排列控件的panel,它会自动的排列在它里面的控件,默认是从左到右,从上到下,用这个控件,就是为了方便不用自己写代码控制button的位置

flowLayoutPanel1.Dock = DockStyle.Left;//这个又是什么意思啊?
这句是让FlowLayoutPanel控件停靠在主窗体上,停靠的方式并不是占满整个主窗体,而是靠左,也就是左边固定在窗体的最左边,右边的大小自己控制,为什么不全屏停靠是因为,这个控件无法让在它里面的控件自动换行,如果窗体很大,那一排就会自动放上多于3个button,所以需要手动设置FlowLayoutPanel的宽度,让它一排只能装下3个button,第4个就自动换到下一行了

this.Controls.Add(flowLayoutPanel1);//为什么要使用这个添加?
这句是将FlowLayoutPanel控件放到窗体中,动态创建的FlowLayoutPanel控件一开始并没有放到窗体中
就像动态创建的button,一开始并没有放到FlowLayoutPanel控件中一样,需要flowLayoutPanel1.Controls.Add(btn)把button放到FlowLayoutPanel中一样

事件的方法很简单,但事件有很多种,每一种的代码稍有点区别,你可以使用一个简便的方法,就是你先用静态的方式,就是弄一个button在设计器上,在事件窗口中双击创建一个事件,然后去Designer中找到自动添加的这行代码,然后复制到程序中,然后把界面还原回来。
如button的点击事件
this.button1.Click += new System.EventHandler(this.button1_Click);
// 控件名(也就是控件的Name,不是Text).Click += new System.EventHandler(响应事件的方法名)
然后就是创建响应方法,方法名要与注册事件时写的方法名一样
private void button1_Click(object sender, EventArgs e)
{
}
取消事件,跟注册事件一样,只是把+=换成-=
this.button1.Click -= new System.EventHandler(this.button1_Click);
程序执行过这一行代码后,就不会再响应点击事件了

像上面的动态的添加9个button的例子,你需要在for里面添加代码,不过要写在btn.Name = btn.Text = "button" + (i + 1);后面,因为要先赋了控件名以后,再添加事件
btn.Name.Click += new System.EventHandler(this.button1_Click);
这样9个button的点击都会进入到private void button1_Click(object sender, EventArgs e)这个方法
2013-04-02 22:33



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-402834-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.257072 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved