动态地将LinkLabel添加到TableLayoutPanel

时间:2012-08-22 16:44:18

标签: c# dynamic linklabel

我遇到了以下代码的问题:

namespace Viewer
{
    public partial class Form1 : Form
    {
        int count = 0;
        LinkLabel[] linkLabel = new LinkLabel[200];
        string filename;
        string extension;
        string filepath;

        private void btnLoad_Click(object sender, EventArgs e)
        {
            // Creates a Directory for the Movies Folder
            DirectoryInfo myDirectory = new DirectoryInfo(@"C:\Users\User\Movies");

            // Creates a list of "File info" objects
            List<FileInfo> ls = new List<FileInfo>();

            // Adds filetypes to the list
            ls.AddRange(myDirectory.GetFiles("*.mp4"));
            ls.AddRange(myDirectory.GetFiles("*.avi"));

            // Orders the list by Name
            List<FileInfo> orderedList = ls.OrderBy(x => x.Name).ToList();

            // Loop through file list to act on each item
            foreach (FileInfo filFile in orderedList)
            {
                // Creates a new link label
                linkLabel[count] = new LinkLabel();

                // Alters name info for display and file calling
                filepath = filFile.FullName;
                extension = filFile.Extension;
                filename = filFile.Name.Remove(filFile.Name.Length - extension.Length);

                // Write to the textbox for functional display
                textBox1.AppendText(filename + "\r\n");

                // Alters link label settings
                linkLabel[count].Text = filename;
                linkLabel[count].Links.Add(0, linkLabel[count].Text.ToString().Length, filepath);
                linkLabel[count].LinkClicked += new LinkLabelLinkClickedEventHandler(LinkedLabelClicked);

                // Adds link label to table display
                tblDisplay.Controls.Add(linkLabel[count]);

                // Indexes count up for arrays
                count = count + 1;
            }
        }

        private void LinkedLabelClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            System.Diagnostics.Process.Start(filepath);
        }

    }
}

我的目标是生成一个链接到我在发布时添加的所有媒体文件的链接表,并让链接打开各自播放器中的文件。

截至目前,它正确生成了所有链接,但每当我点击其中任何一个链接时,它都会启动列表中的最后一项。

例如,如果列表包含“300”,“Gladiator”和“Top Gun”,无论我点击哪个链接,都会打开“Top Gun”。

我认为这与它在click事件中调用变量“filepath”有关,后者处于最终状态。但是,我并不清楚如何在每个链接上创建静态链接值或操作,因为我研究过的所有答案都与单链接标签有关,而不是动态设置。

任何帮助/建议都将不胜感激!

1 个答案:

答案 0 :(得分:0)

请尝试以下方法:
在foreach循环中添加一行更像:

linkLabel[count].Tag = filepath;

然后在点击事件中将此路径视为打击,

private void LinkedLabelClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
    string filepath = ((LinkLabel)sender).Tag.tostring();
    System.Diagnostics.Process.Start(filepath);
}