【问题标题】:Add two components/objects into each panels of tableLayoutPanel programatically - C#以编程方式将两个组件/对象添加到 tableLayoutPanel 的每个面板中 - C#
【发布时间】:2013-07-12 00:34:36
【问题描述】:

我有一个tableLayoutPanel(从工具箱中添加了 10x10 列和行的大小),并且我在每个单元格中添加了单个 Panel,因此我可以在一个单元格中添加两个对象/组件。每个单元格都包含一个label 和一个button。问题是我无法以编程方式将这两个组件添加到panel 中。我该怎么办?

这是我的代码:

private int[,] grid;
private Button[,] btn_grid;
private Label[,] lbl_grid;
private int timer = 0;
private Panel[,] pnl_grid;

        private bool createGrid()
        {
            Random rnd1 = new Random();
            grid = new int[width, height];
            pnl_grid = new Panel[width, height];
            btn_grid = new Button[width, height];
            lbl_grid = new Label[width, height];

            for (int x = 0; x <width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    btn_grid[x, y] = createButton(x, y);
                    lbl_grid[x, y] = createLables(x,y);
                    pnl_grid[x, y] = createPanels(x, y);

                    **//something's missing here to add the 2 components into a panel** 

                    tableLayoutPanel2.Controls.Add(pnl_grid[x,y]);


                }
            }}


private Button createButton(int gridX, int gridY)
{
    Button bttn = new Button();
    bttn.Text = "";
    bttn.Name = gridX.ToString() + " " + gridY.ToString();
    bttn.Size = new System.Drawing.Size(30, 30);
    Controls.AddRange(new System.Windows.Forms.Control[] { bttn, });
    bttn.Click += new System.EventHandler(bttnOnclick);
    //bttn.MouseClick += new System.Windows.Forms.MouseEventHandler(this.bttnOnRightClick);

    return bttn;
}

private Label createLables(int gridX, int gridY)
{
    Label lbl = new Label();
    lbl.Name = gridX.ToString() + " " + gridY.ToString();
    lbl.Text = "0";
    lbl.Size = new System.Drawing.Size(30, 30);
    //lbl.Font = new Font("Microsoft Sans Serif", 15.75f, lbl.Font.Style, lbl.Font.Unit);
    Controls.AddRange(new System.Windows.Forms.Control[] { lbl, });
    return lbl;
}

private Panel createPanels(int gridX, int gridY)
{
    Panel pnl = new Panel();
    pnl.Name = gridX.ToString() + " " + gridY.ToString();
    //pnl.Text = "0";
    pnl.Size = new System.Drawing.Size(30, 30);
    //lbl.Font = new Font("Microsoft Sans Serif", 15.75f, lbl.Font.Style, lbl.Font.Unit);
    Controls.AddRange(new System.Windows.Forms.Control[] { pnl, });
    return pnl;
}

感谢您的关注和帮助!

【问题讨论】:

  • 其实你在做什么,你的代码似乎在表单中添加了标签和按钮

标签: c# object components panel tablelayoutpanel


【解决方案1】:

在您必须将控件添加到tableLayourPanelpanel 的最后一刻之前,您的代码都很好。您只需将panel 添加到panel 中,而不是将button/label 添加到panel

因此,您必须选择:

buttonlabel 添加到panelpaneltableLayoutPanel(这似乎是最合乎逻辑的):

btn_grid[x, y] = createButton(x, y);
lbl_grid[x, y] = createLables(x,y);
pnl_grid[x, y] = createPanels(x, y);
pnl_grid[x, y].Controls.Add(btn_grid[x, y]);
pnl_grid[x, y].Controls.Add(lbl_grid[x, y]);
tableLayoutPanel2.Controls.Add(pnl_grid[x,y]);

或直接将这三个元素添加到tableLayoutPanel

btn_grid[x, y] = createButton(x, y);
lbl_grid[x, y] = createLables(x,y);
pnl_grid[x, y] = createPanels(x, y);
tableLayoutPanel2.Controls.Add(btn_grid[x,y]);
tableLayoutPanel2.Controls.Add(lbl_grid[x,y]);
tableLayoutPanel2.Controls.Add(pnl_grid[x,y]);

【讨论】:

  • 感谢您的回答和帮助,但是我已经尝试了您给定的代码(第一个代码),它没有显示任何错误,但编译后,每个面板都没有两个对象(按钮后面的标签) 我不知道为什么,因为代码看起来是正确的,而第二个代码看起来我们只是在 tableLayoutPanel 的每个单元格中添加了 1 个组件
  • 我的代码和来自 Sriram Sakthivel 的代码基本相同,因此应该提供相同的输出(= 元素包含在面板中)。请记住,他在面板中进行了一些更改,这些更改会影响您所看到的最终外观。但是对于这两种方法,按钮和标签都在相应的面板中。
  • 您能帮我提供设计代码(而不是像 Sriram Sakthivel 提供的功能),以便按钮位于标签顶部吗?
  • 当您添加控件时,它位于随机位置(或者,至少,您不知道)。您必须正确定位它们。请记住,一旦将按钮和标签添加到面板,参考点由它(由面板)给出,即 0,0(用于按钮和标签)位于左/下角面板。因此,添加对象后您要做的第一件事就是重新定位它们。
【解决方案2】:

您可以从createLables, createButton createPanels 方法中删除Controls.AddRange 调用。 然后你可以修改你的 createpanels 方法如下

private Panel createPanels(int gridX, int gridY)
{
    Label lbl = lbl_grid[gridX,gridY];
    Button btn = btn_grid[gridX,gridY];
    Panel pnl = new Panel();
    pnl.Name = gridX.ToString() + " " + gridY.ToString();
    //pnl.Text = "0";
    pnl.Size = new System.Drawing.Size(30, 30);
    //lbl.Font = new Font("Microsoft Sans Serif", 15.75f, lbl.Font.Style, lbl.Font.Unit);
    pnl.Controls.AddRange(new System.Windows.Forms.Control[] { lbl,btn });
    lbl.Dock = DockStyle.Top;
    btn.Dock = DockStyle.Fill;
    return pnl;
}

希望对你有帮助

【讨论】:

  • 我什么都没说(在获奖之前),因为您是第一个发表评论的人(尽管您的评论没有准确地指向正确的方向)但实际上,您的答案是我的副本;嗯...
  • @varocarbas 我不需要复制答案,当我输入答案时没有答案,当我完成发布答案时,我看到了你的答案。这并不意味着复制。每个人都知道 1+1 =2,因为你告诉 1+1=2 这并不意味着谁说相同的答案就是抄袭。所以请在正确的方向更新你的评论
  • 好的,好的……一切都清楚了。我只是想确定一下。因为老实说,我发现 2 分钟后看到一个与我基本相同的答案,我感到非常惊讶。但我明白,当你打字时,你并没有意识到别人写了什么。我相信你的话。
  • @varocarbas 是的。我们是来帮助别人的,为什么我们要窃取别人的代码并获得投票?这没有任何意义。干杯让我们继续提供帮助。
  • 当然,这就是为什么我觉得这有点奇怪(我以前从未发生过)。但不要看错:当我有疑问时,我喜欢坦率地说,不要认为我在暗示什么。
猜你喜欢
  • 2010-11-11
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多