【问题标题】:Adding objects during run time?在运行时添加对象?
【发布时间】:2015-03-24 04:12:55
【问题描述】:

背景

我有一个选项卡,如果我的数据库中的查询返回多条记录,则该选项卡处于活动状态。

对于返回的每条记录,我希望创建一组标签并将其放置在选项卡上。例如,如果有 8 条记录,我希望创建 8 个标签。

问题

  1. 我的循环只创建一个标签,即使我的计数显示我有 8 条记录?不知道为什么?

  2. 如何在循环中创建标签 8 次,而不是让它们在同一位置绘制 8 次?我希望它们出现在水平列表中。很确定我编写解决方案的方式,它们都会被绘制在同一个地方?

代码

for (int i = 1; i <= rowCount; i++)
{      
    // Create objects 
    LinkLabel Linklabel1 = new LinkLabel();
    Linklabel1.Text += ds.Tables[0].Rows[0]["code"].ToString();
    Linklabel1.Location = new Point(10, 50);
    Linklabel1.Height = 40;
    Linklabel1.Width = 100;
    tabControl1.TabPages[0].Controls.Add(Linklabel1);       
}

【问题讨论】:

  • 使用相对于i 索引器的东西设置位置。例如Location = new Point(10, 50 + (i*10));
  • 您有 8 个标签。他们只是占据同一个位置,坐标为 10x50。将 26*i 加到 x 上就可以了。
  • @Darek,按照你的建议做了,但它不起作用。名字不应该也改吗?否则你只会重绘同一个标签 8 次,但只有最后一个是可见的?
  • @ASh 我指的是标签的名称。

标签: c# loops object foreach iteration


【解决方案1】:

试试这样的:

        for (int i = 0; i < rowCount; i++)
        {
            // Create objects 
            LinkLabel Linklabel1 = new LinkLabel();
            Linklabel1.Text = ds.Tables[0].Rows[i]["code"].ToString();
            Linklabel1.Height = 40;
            Linklabel1.Width = 100;
            Linklabel1.Location = new Point((i + 1) * 10 + (i * Linklabel1.Width), 50);
            tabControl1.TabPages[0].Controls.Add(Linklabel1);
        }

如果您不想通过设置 Location() 属性来显式定位它们,请考虑在 TabPage 上放置一个 FlowLayoutPanel 并将控件添加到其中。然后它们会自动为您定位。

【讨论】:

  • 你介意解释一下这条线吗? Linklabel1.Location = new Point((i + 1) * 10 + (i * Linklabel1.Width), 50);
  • 将控件向右移动并且在它们之间提供了10像素的间隙。 i = 0, x = 10 | i = 1, x = 120 | i = 2, x = 230 | i = 3, x = 340 | etc...
猜你喜欢
  • 1970-01-01
  • 2011-12-10
  • 2012-07-07
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
相关资源
最近更新 更多