首页 > 解决方案 > winforms,创建带有按钮的动态表格布局面板所需的帮助

问题描述

我正在尝试创建一个动态表格布局,它创建添加技能并赋予该技能 1 级和增加减少按钮。我正在努力让按钮访问级别标签。我想过找到被点击的按钮的位置,但可以弄清楚如何做到这一点。

提前,谢谢。

例子:

1

这是我到目前为止所拥有的:

        private void skilladded(object sender, EventArgs e)
    {
        int i = 1;
        int[] position= { 0,0};
        bool test = false;
        //string select;
        int k=0;
        for (i=1;i<=skillstableLayoutPanel.RowCount;i++)
        {
            Control c= skillstableLayoutPanel.GetControlFromPosition(0,i);

            if (c!=null&&addskillswin.selected==c.Text)
            {
                test = true;
                k = i;
                break;

            }
            else if(c==null)
            {
                k = i;
                break;
            }
        }

        if (test==false)
        {

            Label newskill = new Label();
            Label newskilllvl = new Label();
            TableLayoutPanel buttontable = new TableLayoutPanel();


            Button up = new Button();
            Button down = new Button();
            buttontable.ColumnCount = 2;
            buttontable.RowCount = 1;
            buttontable.RowStyles.Add(new RowStyle(SizeType.Percent,100f));
            buttontable.ColumnStyles.Add(new ColumnStyle(SizeType.Percent,50f));
            buttontable.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50f));
            buttontable.Margin = new Padding(0,0,0,0);
            buttontable.Dock = DockStyle.Fill;
            buttontable.Controls.Add(up, 0, 0);
            buttontable.Controls.Add(down, 1, 0);
            up.BackgroundImage = Properties.Resources.up;[enter image description here][2]
            down.BackgroundImage = Properties.Resources.down;
            up.BackgroundImageLayout=ImageLayout.Stretch;
            down.BackgroundImageLayout = ImageLayout.Stretch;
            newskill.Text = addskillswin.selected;
            newskilllvl.Text = "1";
            up.Margin = new Padding(0, 0, 0, 0);
            down.Margin = new Padding(0, 0, 0, 0);
            skillstableLayoutPanel.Controls.Add(newskill,0,k);
            skillstableLayoutPanel.Controls.Add(newskilllvl, 1, k);
            skillstableLayoutPanel.Controls.Add(buttontable, 2, k);
            skillavaillabel.Text = (Convert.ToInt32(skillavaillabel.Text) - 1).ToString();
            skillpointlvl = Convert.ToInt32(newskilllvl.Text);

            up.MouseClick += new MouseEventHandler(skillup);                     
            down.MouseClick += new MouseEventHandler(skilldown);


        }
        if (test==true)
        {
            skillstableLayoutPanel.GetControlFromPosition(1, k).Text = (Convert.ToInt32(skillstableLayoutPanel.GetControlFromPosition(1, k).Text) + 1).ToString();
            skillavaillabel.Text = (Convert.ToInt32(skillavaillabel.Text) -1).ToString();
        }

    }
    private void skillup(object sender, EventArgs e)
    {
        skillpointlvl++;

    }
    private void skilldown(object sender, EventArgs e)
    {
        skillpointlvl--;
    }

标签: visual-studiowinformsbuttonvisual-studio-2017dynamic-tables

解决方案


而不是这个:

up.MouseClick += new MouseEventHandler(skillup);                     
down.MouseClick += new MouseEventHandler(skilldown);

尝试这样的事情:

up.MouseClick += ((o, me) =>
{
    int currentLevel = Int32.Parse(newskilllvl.Text);
    currentLevel++;
    newskilllvl.Text = currentLevel.ToString();
});

down.MouseClick += ((o, me) =>
{
    int currentLevel = Int32.Parse(newskilllvl.Text);
    currentLevel--;
    newskilllvl.Text = currentLevel.ToString();
});

您的skillupskilldown事件处理程序可能会处理每个发送者并查看单击源自哪个按钮,但您必须为每个按钮唯一命名并进行大量字符串比较以查看哪个按钮对应于哪个技能级别标签。上面的代码为每个按钮添加了一个匿名处理程序,这使我们基本上可以将被单击的按钮与其对应的技能标签联系起来。

不过,就个人而言,我不会像您所做的那样将所有这些值存储在标签中。我要么将它们存储在表单上的属性中,要么更好地存储在它们自己的类中。我还会将所有这些逻辑放在表单旁边的其他位置,例如在 Presenter 或 Controller(或类库)中,并遵循 MVC 或 MVP 等设计模式。从长远来看,这将使维护和更改应用程序更容易。

此外,请考虑对变量名使用骆驼大小写和帕斯卡大小写。对于有经验的程序员来说,所有小写变量都更难阅读。


推荐阅读