求一段c#动态按钮生成后布局的算法!(同时附段源码供其他人学习)

zk911 2014-12-10 04:14:31

#region[年级、院系对应表]

try
{
foreach (Control con in Controls)
if (con is ComboBox)
(con as ComboBox).DropDownStyle = ComboBoxStyle.DropDownList;
ds_Yuanxi = DBHelper.GetSet("select * from com_basedata where datatype='院系'");
for (int i = 0; i < ds_Yuanxi.Tables[0].Rows.Count; i++)
comboBoxYuanxi.Items.Add(ds_Yuanxi.Tables[0].Rows[i][1]);
}
catch (Exception)
{
MessageBox.Show("数据库连接错误 .\n可能的原因有:\n1.数据库服务没打开\n2.数据库文件未附加\nApp.Config配置未修改 .\n程序已退出 .", "提示", MessageBoxButtons.OK, MessageBoxIcon.Question);
Close();
}
#endregion

//动态添加按钮
if (ds_Yuanxi.Tables[0].Rows.Count > 0)
{
int n = ds_Yuanxi.Tables[0].Rows.Count;
int a = 1;
for (; a <= n; a++)
{
Button btnYuanxi = new Button();
this.Controls.Add(btnYuanxi);
btnYuanxi.Text = ds_Yuanxi.Tables[0].Rows[a - 1][1].ToString();
btnYuanxi.SetBounds(10, 120 + 80 * (a - 1), 180, 50); //设置按钮位置
btnYuanxi.PerformClick();
btnYuanxi.Click += new EventHandler(btnYuanxi_Click);
}
}
else
{
MessageBox.Show("miss");
}



以上是动态按钮的生成方法, 这代码只能在某一列一直向下生成按钮(若按钮很多时直接顶出界面了),现在我想在一列里生成6行后 直接换到下一列生成6行,以此类推,求方法解决,谢谢!!!
...全文
263 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zk911 2014-12-12
  • 打赏
  • 举报
回复

C# code
int x = 10, y = 10;
for (int i = 0; i < 20; i++)
{
    Button btnAdd = new Button();
    this.Controls.Add(btnAdd);
    btnAdd.Text = i.ToString();
    btnAdd.SetBounds(x, y, 180, 50);
    x = 10 + (i / 6) * 180;// i/6代表现在是第几列,这里没有加上间距
    y = 10 + (i % 6) * 50;// i%6代表现在是第几行,这里没有加上间距
}
请问这里的间距如何设置,对这个函数不太熟悉!
SmileSkyNet 2014-12-12
  • 打赏
  • 举报
回复
首先这个代码有问题,button没有width和height,还有算法有问题 if (ds_Yuanxi.Tables[0].Rows.Count > 0) { int n = ds_Yuanxi.Tables[0].Rows.Count;     int topSet=0;int leftSet=0; foreach(DataRow dr in ds_Yuanxi.Tables[0].Rows) { if(topSet==6) { leftSet+=1; topSet=0; } Button btnYuanxi = new Button(); btnYuanxi.Text = dr["列表"].ToString(); btnYuanxi.Width=...; btnYuanxi.Height=80; btnYuanxi.Left=10*leftSet; btnYuanxi.Top=120+80*topSet; btnYuanxi.Click += new EventHandler(btnYuanxi_Click); this.Controls.Add(btnYuanxi); topSet+=1; } }
zk911 2014-12-11
  • 打赏
  • 举报
回复
嗯,明白了,感谢2位大神指点迷津。
枫0子K 2014-12-10
  • 打赏
  • 举报
回复
引用 2 楼 Yokeqi 的回复:
几个问题: 1. btnYuanxi.PerformClick();这行代码可以去掉,因为你都还没注册点击事件。如果是想生成后模拟点击就移到Click下面。

int x = 10, y = 10;
for (int i = 0; i < 20; i++)
{
    Button btnAdd = new Button();
    this.Controls.Add(btnAdd);
    btnAdd.Text = i.ToString();
    btnAdd.SetBounds(x, y, 180, 50);
    x = 10 + (i / 6) * 180;// i/6代表现在是第几列,这里没有加上间距
    y = 10 + (i % 6) * 50;// i%6代表现在是第几行,这里没有加上间距
}
我这里说btnYuanxi.PerformClick();可以去掉是因为这是模拟按钮点击。但这个时候你的点击事件还没有绑定,所以这段代码执行了也是没用的。 另你想根据窗体分辨率来排列按钮值需要把我上面代码里面的6动态计算成窗体(w/h)分别能容纳的按钮个数。 如:int hNum = this.width/180;//计算横向最多可以放下多少个按钮,实际你还要考虑间距。 x = 10 + (1/ hNum) * 180;
shushukui 2014-12-10
  • 打赏
  • 举报
回复
for列循环 fro行循环
zk911 2014-12-10
  • 打赏
  • 举报
回复

 private void FormYuanxi_Load(object sender, EventArgs e)
        {
            groupBox1.BackColor = Color.Transparent;  //GroupBox的背景设为透明

            FindYuanxi findyuanxi = new FindYuanxi();
            findyuanxi.DoubleBuffered = true;  //加快运行速度,双缓冲处理

            comboBoxYuanxi.Visible = false;
            textBoxNianji.Text = cxl.nianji;

            #region[年级、院系对应表]

            try
            {
                foreach (Control con in Controls)
                    if (con is ComboBox)
                        (con as ComboBox).DropDownStyle = ComboBoxStyle.DropDownList;

                ds_Yuanxi = DBHelper.GetSet("select * from com_basedata where datatype='院系'");
                for (int i = 0; i < ds_Yuanxi.Tables[0].Rows.Count; i++)

                    comboBoxYuanxi.Items.Add(ds_Yuanxi.Tables[0].Rows[i][1]);


                //comboBoxYuanxi.SelectedIndex = 0;

            }
            catch (Exception)
            {
                MessageBox.Show("数据库连接错误 .\n可能的原因有:\n1.数据库服务没打开\n2.数据库文件未附加\nApp.Config配置未修改 .\n程序已退出 .", "提示", MessageBoxButtons.OK, MessageBoxIcon.Question);
                Close();
            }
            #endregion

            //动态添加按钮
            if (ds_Yuanxi.Tables[0].Rows.Count > 0)
            {
                int n = ds_Yuanxi.Tables[0].Rows.Count;
                int a = 1;
                for (; a <= n; a++)
                {
                    Button btnYuanxi = new Button();
                    this.Controls.Add(btnYuanxi);
                    btnYuanxi.Text = ds_Yuanxi.Tables[0].Rows[a - 1][1].ToString();
                    Font newFont = new Font("宋体", 12);  //按钮字体大小
                    btnYuanxi.Font = newFont;
                    btnYuanxi.SetBounds(10, 120 + 80 * (a - 1), 180, 50);   //设置按钮位置
                    btnYuanxi.PerformClick();
                    btnYuanxi.Click += new EventHandler(btnYuanxi_Click);
                }
            }
            else
            {
                MessageBox.Show("miss");
            }

        }

        private void btnYuanxi_Click(object sender, EventArgs e)
        {
            Button btnzhuanye = (Button)sender;

            cxl.xueyuan = btnzhuanye.Text;
            textBoxYuanxi.Text = cxl.xueyuan;
            //MessageBox.Show(btnzhuanye.Text);

            FindZhuanye findzhuanye = new FindZhuanye();
            findzhuanye.ShowDialog();
        }
这是全源码,btnYuanxi.PerformClick(); 这个是不能去掉的。
zk911 2014-12-10
  • 打赏
  • 举报
回复
嗯 这里还需要判断窗体的大小吧 主要让按钮想随着窗体的变化而变化,而使用不同的显示分辨率
於黾 2014-12-10
  • 打赏
  • 举报
回复
其实就是 int x=0,y=0; for(a;;) { if(a%6==0) { x+=30;y=0; } y+=30; }
於黾 2014-12-10
  • 打赏
  • 举报
回复
你重新定义两个int变量x,y 然后根据a去计算x,y 用x,y给坐标赋值 这样逻辑上就清晰了 不要把公式直接写到参数里,看起来很乱
枫0子K 2014-12-10
  • 打赏
  • 举报
回复
几个问题: 1. btnYuanxi.PerformClick();这行代码可以去掉,因为你都还没注册点击事件。如果是想生成后模拟点击就移到Click下面。

int x = 10, y = 10;
for (int i = 0; i < 20; i++)
{
    Button btnAdd = new Button();
    this.Controls.Add(btnAdd);
    btnAdd.Text = i.ToString();
    btnAdd.SetBounds(x, y, 180, 50);
    x = 10 + (i / 6) * 180;// i/6代表现在是第几列,这里没有加上间距
    y = 10 + (i % 6) * 50;// i%6代表现在是第几行,这里没有加上间距
}
於黾 2014-12-10
  • 打赏
  • 举报
回复
做个双重for循环不就得了 或者加个判断,如果i是6的整数倍,则x轴坐标+=一个数

111,094

社区成员

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

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

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