Новое в C # - проблемы с ярлыками и функциями ссылок - PullRequest
3 голосов
/ 02 мая 2011

Я новичок в C # и ранее писал только программы на JavaScript, так что будьте спокойны!

Я написал программу для запуска приложений, которая читает текстовый файл построчно. Каждая строка - это просто путь к программе, например C: \ Users \ Jim \ Desktop \ Gravity.exe

Пока что моя программа может успешно читать каждую строку и создавать список ссылок. Как и предполагалось, каждая ссылка отображается как сам путь.

У меня проблема в том, что эти ссылки не будут работать. Однако они БУДУТ работать, если им всем будет дан один и тот же фиксированный путь. Я хотел бы, чтобы каждая ссылка использовала свое свойство .Text в качестве места назначения. (пожалуйста, смотрите комментарии «работает» и «не работает» в моем коде ниже). Единственная ошибка, которую я получаю - «не могу найти указанный файл».

Я был бы очень признателен за любую помощь в этом, так как я нахожу C # намного сложнее, чем Javascript!

public partial class Form1 : Form
{
    private void Form1_Load(object sender, EventArgs e)   //on form load
    {
        int counter = 0;
        string line;
        string myfile = @"c:\users\matt\desktop\file.txt";

        // Read the file and display it line by line.
        System.IO.StreamReader file = new System.IO.StreamReader(myfile);
        while ((line = file.ReadLine()) != null)
        {
            //MessageBox.Show(line);   //check whats on each line

            LinkLabel mylinklabel = new LinkLabel();        //LinkLabel tells us the type of the object   e.g.  string mystring ="hello";
            mylinklabel.Text = line;
            this.Controls.Add(mylinklabel);
            mylinklabel.Location = new Point(0, 30 + counter * 30);

            mylinklabel.Click += new System.EventHandler(LinkClick);

            counter++;
        }
        file.Close();
    }

    private void LinkClick(object sender, System.EventArgs e)
    {
        //Process.Start(this.Text);  //doesn't work
        Process.Start(@"C:\Users\Jim\Desktop\gravity.exe");   //works
    }        
}

Обновление:

Спасибо за ваши комментарии, ребята. Я изменил эту строку на:

Process.Start(((LinkLabel)sender).Text); 

... и это действительно работает. Но, возможно, я мог бы задать вопрос об этой строке, так как я нахожу синтаксис немного необычным и запутанным.

Не является ли sender свойством объекта LinkLabel? Поэтому, чтобы сослаться на это, мы не должны использовать LinkLabel.sender? (это было бы больше в стиле JavaScript! Я не понимаю нотацию (LinkLabel)sender)

Я тоже не понимаю:

private void LinkClick(object sender, System.EventArgs e)

Что означает пробел? Например, между object и sender? Или между System.EventArgs е? LinkClick - это название события, но почему у нас есть две вещи, разделенные запятой?

Как вы можете сказать, в настоящее время я нахожу синтаксис C # немного сложным!

Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 02 мая 2011

Использование this.Text является, по крайней мере, одной из проблем.

this относится к текущему экземпляру вашего класса. То, что вы хотите, это экземпляр LinkLabel, по которому щелкнули. К счастью, аргумент sender события предоставляет эту информацию.

Так что попробуйте что-то вроде этого.

LinkLabel lnk = sender as LinkLabel;
System.Diagnostics.Process.Start(lnk.Text);
0 голосов
/ 02 мая 2011

Этот пример говорит вам лучший способ достичь этого.

http://msdn.microsoft.com/en-us/library/system.windows.forms.linklabel.linkclicked%28v=VS.100%29.aspx

 private void linkLabel1_LinkClicked(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e)
    {
        // Determine which link was clicked within the LinkLabel.
        this.linkLabel1.Links[linkLabel1.Links.IndexOf(e.Link)].Visited = true;

        // Display the appropriate link based on the value of the 
        // LinkData property of the Link object.
        string target = e.Link.LinkData as string;

        // If the value looks like a URL, navigate to it.
        // Otherwise, display it in a message box.
        if(null != target && target.StartsWith("www"))
        {
            System.Diagnostics.Process.Start(target);
        }
        else
        {    
            MessageBox.Show("Item clicked: " + target);
        }
    }
0 голосов
/ 02 мая 2011
private void LinkClick(object sender, System.EventArgs e)
{
    LinkLabel ll = (LinkLabel)sender;
    System.Diagnostics.Process.Start(ll.Text);
}
0 голосов
/ 02 мая 2011

В этом контексте «this.Text» относится к тексту заголовка вашей формы.Пользователь ((LinkLabel) отправитель) .Текст

...