动态添加的标签仅显示一个

时间:2014-10-07 18:00:27

标签: c# forms dynamic controls panel

好的,所以我决定根据数组中的标签向form_load上的面板添加控件。下面是我的代码,但无论我通过按钮监听器上传了多少文件并重新加载此表单,它只显示一个标签,仅此而已。为什么只显示一个?我添加了一个断点并验证了计数确实达到了2,3等等。

代码:

public partial class Attachments : Form
    {
        ArrayList attachmentFiles;
        ArrayList attachmentNames;
        public Attachments(ArrayList attachments, ArrayList attachmentFileNames)
        {
            InitializeComponent();
            attachmentFiles = attachments;
            attachmentNames = attachmentFileNames;
        }

        private void Attachments_Load(object sender, EventArgs e)
        {
            ScrollBar vScrollBar1 = new VScrollBar();
            vScrollBar1.Dock = DockStyle.Right;
            vScrollBar1.Scroll += (sender2, e2) => { pnl_Attachments.VerticalScroll.Value = vScrollBar1.Value; };
            pnl_Attachments.Controls.Add(vScrollBar1);
            Label fileName;
            for (int i = 0; i < attachmentNames.Count; i++)
            {
                fileName = new Label();
                fileName.Text = attachmentNames[i].ToString();
                pnl_Attachments.Controls.Add(fileName);
            }
        }

        private void btn_AddAttachment_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string fileName = openFileDialog1.FileName;
                attachmentFiles.Add(fileName);
                attachmentNames.Add(Path.GetFileName(fileName));
                this.Close();
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

这是因为标签全部堆叠在一起。您需要为每个指定顶部或使用自动流程面板。

创建新标签后添加以下行将确保所有标签都可见(您可能需要根据字体调整乘数):

fileName.Top = (i + 1) * 22;

答案 1 :(得分:0)

正如competent_tech所述,标签堆叠在一起,但另一种方法是修改标签的位置值。这样做的好处是可以控制标签的绝对位置。

fileName.Location = new Point(x, y);
y += marginAmount;

x是表单上的垂直位置,y是表单上的水平位置。然后,所有必须修改的是marginAmount变量中每个标签之间所需的空间量。

所以在这个for循环中

for (int i = 0; i < attachmentNames.Count; i++)
{
    fileName = new Label();
    fileName.Text = attachmentNames[i].ToString();
    pnl_Attachments.Controls.Add(fileName);
}

您可以将其修改为:

for (int i = 0; i < attachmentNames.Count; i++)
{
    fileName = new Label();
    fileName.Text = attachmentNames[i].ToString();
    fileName.Location = new Point(x, y);
    y += marginAmount;
    pnl_Attachments.Controls.Add(fileName);
}

然后你要做的就是定义x,y和marginAmount。