winform求最高效的排版代码

时间:2022-06-08 06:34:54
求一段代码(winform窗体):
用for循环创建x(x可以任意多少)个button,
然后用 最高效的代码,把这x个按钮排列在界面上,从左到右,从上到下的顺序。
最好能在界面上输入x,每个按钮之间的距离。
同时在窗体大小改变的时候,也能最高效的从新排列。

10 个解决方案

#1


保留前一个座标,创建下一个时按座标增量设置按钮位置

#2


看到你用for创建button的时候,我想起我自己以前想一步登天的想法,还是自己一个个拖吧,半个小时能完成的用拖,你要用你自己说的for你估计搞到你爽都搞不好,我自己亲自试过,还没到那水平就别想那些技术

#3


用 flowLayoutPanel 来加载button就用不着自己排列 button了

#4


引用 2 楼 u011130289 的回复:
看到你用for创建button的时候,我想起我自己以前想一步登天的想法,还是自己一个个拖吧,半个小时能完成的用拖,你要用你自己说的for你估计搞到你爽都搞不好,我自己亲自试过,还没到那水平就别想那些技术


你可能想的太复杂了,我用for是因为我的按钮是不确定的,通过读取数据库里面的数据,一行数据代表一个button。然后创建button添加到界面排版,这种情况是没法拖的。我实现过,只是我觉得我的代码效率太低了!

#5


引用 3 楼 happy09li 的回复:
用 flowLayoutPanel 来加载button就用不着自己排列 button了


这个试过 ,快,可是每个按钮之间的间距如何设置呢?

#6


引用 5 楼 china_boy_p 的回复:
Quote: 引用 3 楼 happy09li 的回复:

用 flowLayoutPanel 来加载button就用不着自己排列 button了


这个试过 ,快,可是每个按钮之间的间距如何设置呢?


你改变button的margin属性看下效果

#7




        Panel p = new Panel();
        public Form4()
        {
            InitializeComponent();
            p.Dock = DockStyle.Fill;
            this.Controls.Add(p);
            this.SizeChanged+=new EventHandler(Form4_SizeChanged);
        }

        private void Form4_SizeChanged(object sender, EventArgs e)
        {
            this.p.Controls.Clear();
            int w = this.p.Width;
            int h = this.p.Height;
            int x = 0, y = 0;
            int cs = 5, vs = 3;
            int tb = 0;
            for (; y < h; )
            {
                Application.DoEvents();
                y += tb;
                for (; x < w; )
                {
                    Button b = new Button();
                    b.Padding = new Padding(cs, vs, 0, 0);
                    b.Location = new Point(x, y);
                    x += cs + b.Width;
                    if (vs + b.Height > tb)
                        tb = vs + b.Height;
                    if (x >= w) { x = 0; break; }
                    if (y + tb >= h) return;
                    this.p.Controls.Add(b);
                    Application.DoEvents();
                }
            }
        }

其实挺好玩的,很明显,需要的显存很大,CPU消耗还不大

#8


 Panel p = new Panel();
        public Form4()
        {
            InitializeComponent();
            p.Dock = DockStyle.Fill;
            this.Controls.Add(p);
            this.SizeChanged+=new EventHandler(Form4_SizeChanged);
        }

        private void b_Click(object sender, EventArgs e)
        {
            MessageBox.Show(((Button)sender).Text);
        }
        private void Form4_SizeChanged(object sender, EventArgs e)
        {
            this.p.Controls.Clear();
            int w = this.p.Width;
            int h = this.p.Height;
            int x = 0, y = 0;
            int cs = 5, vs = 3;
            int tb = 0;
            int n = 0;
            for (; y < h; )
            {
                Application.DoEvents();
                y += tb;
                for (; x < w; )
                {
                    Button b = new Button();
                    b.Width = new Random().Next(30,100);
                    b.Click += new EventHandler(b_Click);
                    b.Padding = new Padding(cs, vs, 0, 0);
                    b.Location = new Point(x, y);
                    x += cs + b.Width;
                    if (vs + b.Height > tb)
                        tb = vs + b.Height;
                    if (x >= w) { x = 0; break; }
                    if (y + tb >= h) return;
                    n++; b.Text = n.ToString();
                    this.p.Controls.Add(b);
                    Application.DoEvents();
                }
            }

        }

随便排版

#9


引用 6 楼 happy09li 的回复:
Quote: 引用 5 楼 china_boy_p 的回复:

Quote: 引用 3 楼 happy09li 的回复:

用 flowLayoutPanel 来加载button就用不着自己排列 button了


这个试过 ,快,可是每个按钮之间的间距如何设置呢?


你改变button的margin属性看下效果


如何设置一行有多少个呢?比如说我要固定每行5个,随窗体最大化,拖动,都是只有一行5个。

#10


引用 9 楼 china_boy_p 的回复:
Quote: 引用 6 楼 happy09li 的回复:

Quote: 引用 5 楼 china_boy_p 的回复:

Quote: 引用 3 楼 happy09li 的回复:

用 flowLayoutPanel 来加载button就用不着自己排列 button了


这个试过 ,快,可是每个按钮之间的间距如何设置呢?


你改变button的margin属性看下效果


如何设置一行有多少个呢?比如说我要固定每行5个,随窗体最大化,拖动,都是只有一行5个。


那button之间的间距是否变动呢?
如果变动的话 就按上面的方法算,如果不变动,那设置flowLayoutPanel  的宽度不随窗体大小变化就可以了

#1


保留前一个座标,创建下一个时按座标增量设置按钮位置

#2


看到你用for创建button的时候,我想起我自己以前想一步登天的想法,还是自己一个个拖吧,半个小时能完成的用拖,你要用你自己说的for你估计搞到你爽都搞不好,我自己亲自试过,还没到那水平就别想那些技术

#3


用 flowLayoutPanel 来加载button就用不着自己排列 button了

#4


引用 2 楼 u011130289 的回复:
看到你用for创建button的时候,我想起我自己以前想一步登天的想法,还是自己一个个拖吧,半个小时能完成的用拖,你要用你自己说的for你估计搞到你爽都搞不好,我自己亲自试过,还没到那水平就别想那些技术


你可能想的太复杂了,我用for是因为我的按钮是不确定的,通过读取数据库里面的数据,一行数据代表一个button。然后创建button添加到界面排版,这种情况是没法拖的。我实现过,只是我觉得我的代码效率太低了!

#5


引用 3 楼 happy09li 的回复:
用 flowLayoutPanel 来加载button就用不着自己排列 button了


这个试过 ,快,可是每个按钮之间的间距如何设置呢?

#6


引用 5 楼 china_boy_p 的回复:
Quote: 引用 3 楼 happy09li 的回复:

用 flowLayoutPanel 来加载button就用不着自己排列 button了


这个试过 ,快,可是每个按钮之间的间距如何设置呢?


你改变button的margin属性看下效果

#7




        Panel p = new Panel();
        public Form4()
        {
            InitializeComponent();
            p.Dock = DockStyle.Fill;
            this.Controls.Add(p);
            this.SizeChanged+=new EventHandler(Form4_SizeChanged);
        }

        private void Form4_SizeChanged(object sender, EventArgs e)
        {
            this.p.Controls.Clear();
            int w = this.p.Width;
            int h = this.p.Height;
            int x = 0, y = 0;
            int cs = 5, vs = 3;
            int tb = 0;
            for (; y < h; )
            {
                Application.DoEvents();
                y += tb;
                for (; x < w; )
                {
                    Button b = new Button();
                    b.Padding = new Padding(cs, vs, 0, 0);
                    b.Location = new Point(x, y);
                    x += cs + b.Width;
                    if (vs + b.Height > tb)
                        tb = vs + b.Height;
                    if (x >= w) { x = 0; break; }
                    if (y + tb >= h) return;
                    this.p.Controls.Add(b);
                    Application.DoEvents();
                }
            }
        }

其实挺好玩的,很明显,需要的显存很大,CPU消耗还不大

#8


 Panel p = new Panel();
        public Form4()
        {
            InitializeComponent();
            p.Dock = DockStyle.Fill;
            this.Controls.Add(p);
            this.SizeChanged+=new EventHandler(Form4_SizeChanged);
        }

        private void b_Click(object sender, EventArgs e)
        {
            MessageBox.Show(((Button)sender).Text);
        }
        private void Form4_SizeChanged(object sender, EventArgs e)
        {
            this.p.Controls.Clear();
            int w = this.p.Width;
            int h = this.p.Height;
            int x = 0, y = 0;
            int cs = 5, vs = 3;
            int tb = 0;
            int n = 0;
            for (; y < h; )
            {
                Application.DoEvents();
                y += tb;
                for (; x < w; )
                {
                    Button b = new Button();
                    b.Width = new Random().Next(30,100);
                    b.Click += new EventHandler(b_Click);
                    b.Padding = new Padding(cs, vs, 0, 0);
                    b.Location = new Point(x, y);
                    x += cs + b.Width;
                    if (vs + b.Height > tb)
                        tb = vs + b.Height;
                    if (x >= w) { x = 0; break; }
                    if (y + tb >= h) return;
                    n++; b.Text = n.ToString();
                    this.p.Controls.Add(b);
                    Application.DoEvents();
                }
            }

        }

随便排版

#9


引用 6 楼 happy09li 的回复:
Quote: 引用 5 楼 china_boy_p 的回复:

Quote: 引用 3 楼 happy09li 的回复:

用 flowLayoutPanel 来加载button就用不着自己排列 button了


这个试过 ,快,可是每个按钮之间的间距如何设置呢?


你改变button的margin属性看下效果


如何设置一行有多少个呢?比如说我要固定每行5个,随窗体最大化,拖动,都是只有一行5个。

#10


引用 9 楼 china_boy_p 的回复:
Quote: 引用 6 楼 happy09li 的回复:

Quote: 引用 5 楼 china_boy_p 的回复:

Quote: 引用 3 楼 happy09li 的回复:

用 flowLayoutPanel 来加载button就用不着自己排列 button了


这个试过 ,快,可是每个按钮之间的间距如何设置呢?


你改变button的margin属性看下效果


如何设置一行有多少个呢?比如说我要固定每行5个,随窗体最大化,拖动,都是只有一行5个。


那button之间的间距是否变动呢?
如果变动的话 就按上面的方法算,如果不变动,那设置flowLayoutPanel  的宽度不随窗体大小变化就可以了