3

私は C# の初心者で、以前は JavaScript でしかプログラムを作成したことがありません。

テキストファイルを1行ずつ読み取る「アプリランチャー」プログラムを作成しました。各行はプログラムへの単なるパスです (例: 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か? (LinkLabel)sender(これはより JavaScript スタイルになります!表記がわかりません)

私も理解していません:

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

スペース とはどういう意味ですか? との間objectなど senderまたはSystem.EventArgseの間? LinkClickはイベントの名前ですが、なぜ 2 つのものがコンマで区切られているのでしょうか?

お分かりのように、私は現在、C# 構文が少し難しいと感じています!

前もって感謝します。

4

4 に答える 4

3

の使用はthis.Text、少なくとも 1 つの問題のようです。

thisクラスの現在のインスタンスを参照します。必要なのは、LinkLabelクリックされたのインスタンスです。幸いなことに、イベントのsender引数がこの情報を提供します。

代わりに、このようなことを試してください。

LinkLabel lnk = sender as LinkLabel;
System.Diagnostics.Process.Start(lnk.Text);
于 2011-05-02T18:41:01.900 に答える
0
private void LinkClick(object sender, System.EventArgs e)
{
    LinkLabel ll = (LinkLabel)sender;
    System.Diagnostics.Process.Start(ll.Text);
}
于 2011-05-02T18:43:21.193 に答える
0

そのコンテキストでは、「this.Text」は、FORMS テキスト キャプションを指します。ユーザー ((LinkLabel) 送信者). テキスト

于 2011-05-02T18:41:38.003 に答える
0

この例は、これを達成するためのより良い方法を示しています。

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);
        }
    }
于 2011-05-02T18:47:45.083 に答える