C# Programming

ImageLinkLabel

開発環境: Visual Studio 2003 

目次

LinkLabel の使い方

次のような機能のForm アプリケーションを作る。
  • リンクをクリックすると標準メイラーで新規メイルを開く。
  • リンクをクリックすると標準ブラウザーでリンクラベルのURLを開く。クリック時にリンクの色を変える。
  • 北海道、東北、関東のそれぞれのリンクをクリックすると、それぞれのURLで開く。クリック時にリンクの色を変える。
Image

作り方(その1) もっとも簡単な方法

1. フォームに ツールボックスより、LinkLabel を貼り付ける。
2. フォームに ツールボックスより、つぎのようにリンクラベルを設定する。
linkLabel1 のプロパティ
プロパティ
Textmailto: xxx@yyy.co.jp
3. プロパティのイベントより、OnClick 時のイベントハンドラ OnMailto (任意名) を追加する。

4. イベントハンドラーのコーディング

private void OnMailTo(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e)
{
        System.Diagnostics.Process.Start(this.linkLabel1.Text);
}
注意: この方法だと、イベントハンドラが特定のインスタンスに依存してしまう。
コメント: System.Diagnostics の下に Process があるなんぞ、どういう設計思想をしているんじゃ!

クリックしたときにリンクの色を変える方法(その1)

イベントハンドラーで、LinkVisited = true;

private void OnHttpClick(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e)
{
          this.linkLabel2.LinkVisited = true;

           System.Diagnostics.Process.Start(this.linkLabel2.Text);
}
注意: this.linkLabel2.LinkVisited = true では、次の作り方(その2)では、うまくいかない。

作り方(その2) 任意のサブ文字列をクリックして、対応したURLをブラウザで開く。

linkLabl2 "北海道、東北、関東" の例

補足: ちょっと面倒だけど、 LinkLabel.Links コレクションにリンクデータを Add() して、イベントハンドラーで LinkData を参照するのが正しいやり方。

1. フォームに ツールボックスより、LinkLabel を貼り付ける。
2. フォームに ツールボックスより、つぎのようにリンクラベルを設定する。
linkLabel1 のプロパティ
プロパティ
Text任意の文字列

3. リンクラベルの初期化処理の追加
    リンクラベル初期化メソッドとして、次のような InitLinkLbels()を追加する。

                /// <summary>
                /// linkLabl2 "北海道、東北、関東" の例のリンクラベル初期化メソッド
                /// </summary>
                private void InitLinkLabels()
                {
                        linkLabel3.Text = "北海道、東北、関東";

                        this.AddLinkLabel( this.linkLabel3, "北海道", 
                                "http://dir.yahoo.co.jp/Regional/Japanese_Regions/Hokkaido/");

                        this.AddLinkLabel( this.linkLabel3, "東北", 
                                "http://dir.yahoo.co.jp/Regional/Japanese_Regions/Tohoku/");

                        this.AddLinkLabel( this.linkLabel3, "関東", 
                                "http://dir.yahoo.co.jp/Regional/Japanese_Regions/Kanto/");
                }
4. リンクラベル挿入のためのメソッドの追加
"北海道、東北、関東"文字列のうち、word に一致する文字列に対しリンクを挿入するためのメソッドとして、AddLinkLabel)を追加する。
                /// <summary>
                /// linkLabl2 "北海道、東北、関東" の例のリンクラベル挿入のためのメソッド
                /// </summary>
                /// <param name="linkLabel">リンクラベルインスタンス</param>
                /// <param name="word">リンクに変換する文字列</param>
                /// <param name="link">リンク先</param>
                private void AddLinkLabel( System.Windows.Forms.LinkLabel linkLabel, string word, string link )
                {
                        int startIndex = linkLabel.Text.IndexOf(word, 0, linkLabel.Text.Length);
                        linkLabel.Links.Add(startIndex, word.Length, link);
                }
5. プロパティのイベントより、OnClick 時のイベントハンドラ OnHttpClick2 (任意名) を追加する。
    
                /// <summary>
                /// linkLabl2 "北海道、東北、関東" の例のイベントハンドラ
                /// </summary>
                /// <param name="sender"></param>
                /// <param name="e"></param>
                private void OnHttpLink2(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e)
                { 
                        // c
                        // 正しくは、e.Link.Visited = true; とすべき。
                        e.Link.Visited = true;
                        System.Diagnostics.Process.Start(e.Link.LinkData.ToString());
                }
注意: このように LinkData コレクションを使うことにより、イベントハンドラ内で特定のインスタンスに依存しない形でかけるので、多少手間でもこちらの方法のほうがよい。

ソースコード

日付修正履歴
5/10初期バージョン作成

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace LinkLabel
{
        /// <summary>
        /// Form1 の概要の説明です。
        /// </summary>
        public class Form1 : System.Windows.Forms.Form
        {
                private System.Windows.Forms.LinkLabel linkLabel1;
                private System.Windows.Forms.GroupBox groupBox1;
                private System.Windows.Forms.LinkLabel linkLabel3;
                private System.Windows.Forms.LinkLabel linkLabel2;
                /// <summary>
                /// 必要なデザイナ変数です。
                /// </summary>
                private System.ComponentModel.Container components = null;

                public Form1()
                {
                        //
                        // Windows フォーム デザイナ サポートに必要です。
                        //
                        InitializeComponent();

                        //
                        // TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。
                        //
                        InitLinkLabels();
                }

                /// <summary>
                /// 使用されているリソースに後処理を実行します。
                /// </summary>
                protected override void Dispose( bool disposing )
                {
                        if( disposing )
                        {
                                if (components != null) 
                                {
                                        components.Dispose();
                                }
                        }
                        base.Dispose( disposing );
                }

                #region Windows Form Designer generated code
                /// <summary>
                /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
                /// コード エディタで変更しないでください。
                /// </summary>
                private void InitializeComponent()
                {
                        this.linkLabel1 = new System.Windows.Forms.LinkLabel();
                        this.linkLabel3 = new System.Windows.Forms.LinkLabel();
                        this.linkLabel2 = new System.Windows.Forms.LinkLabel();
                        this.groupBox1 = new System.Windows.Forms.GroupBox();
                        this.groupBox1.SuspendLayout();
                        this.SuspendLayout();
                        // 
                        // linkLabel1
                        // 
                        this.linkLabel1.Location = new System.Drawing.Point(24, 16);
                        this.linkLabel1.Name = "linkLabel1";
                        this.linkLabel1.Size = new System.Drawing.Size(208, 16);
                        this.linkLabel1.TabIndex = 0;
                        this.linkLabel1.TabStop = true;
                        this.linkLabel1.Text = "mailto:xxx@yyy.co.jp";
                        this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnMailTo);
                        // 
                        // linkLabel3
                        // 
                        this.linkLabel3.Location = new System.Drawing.Point(24, 40);
                        this.linkLabel3.Name = "linkLabel3";
                        this.linkLabel3.Size = new System.Drawing.Size(136, 16);
                        this.linkLabel3.TabIndex = 1;
                        this.linkLabel3.TabStop = true;
                        this.linkLabel3.Text = "こちらをご覧ください。";
                        this.linkLabel3.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnHttpLink2);
                        // 
                        // linkLabel2
                        // 
                        this.linkLabel2.Location = new System.Drawing.Point(24, 48);
                        this.linkLabel2.Name = "linkLabel2";
                        this.linkLabel2.Size = new System.Drawing.Size(280, 16);
                        this.linkLabel2.TabIndex = 2;
                        this.linkLabel2.TabStop = true;
                        this.linkLabel2.Text = "http://uchukamen.com/";
                        this.linkLabel2.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnHttpClick);
                        // 
                        // groupBox1
                        // 
                        this.groupBox1.Controls.AddRange(new System.Windows.Forms.Control[] {
                        this.linkLabel3});
                        this.groupBox1.Location = new System.Drawing.Point(24, 88);
                        this.groupBox1.Name = "groupBox1";
                        this.groupBox1.Size = new System.Drawing.Size(304, 88);
                        this.groupBox1.TabIndex = 5;
                        this.groupBox1.TabStop = false;
                        this.groupBox1.Text = "地域情報";
                        // 
                        // Form1
                        // 
                        this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
                        this.ClientSize = new System.Drawing.Size(384, 206);
                        this.Controls.AddRange(new System.Windows.Forms.Control[] {
                        this.linkLabel2,
                        this.linkLabel1,
                        this.groupBox1});
                        this.Name = "Form1";
                        this.Text = "Form1";
                        this.groupBox1.ResumeLayout(false);
                        this.ResumeLayout(false);

                }
                #endregion

                /// <summary>
                /// アプリケーションのメイン エントリ ポイントです。
                /// </summary>
                [STAThread]
                static void Main() 
                {
                        Application.Run(new Form1());
                }

                /// <summary>
                /// linkLabl1 "mailto:xxx@yyy.co.jp" の例
                /// </summary>
                /// <param name="sender"></param>
                /// <param name="e"></param>
                private void OnMailTo(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e)
                {
                        System.Diagnostics.Process.Start(this.linkLabel1.Text);
                }

                /// <summary>
                /// linkLabl2 "http://uchukamen.com/" の例
                /// </summary>
                /// <param name="sender"></param>
                /// <param name="e"></param>
                private void OnHttpClick(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e)
                {
                        this.linkLabel2.LinkVisited = true;

                        System.Diagnostics.Process.Start(this.linkLabel2.Text);
                }

                /// <summary>
                /// linkLabl2 "北海道、東北、関東" の例のリンクラベル初期化メソッド
                /// </summary>
                private void InitLinkLabels()
                {
                        linkLabel3.Text = "北海道、東北、関東";

                        this.AddLinkLabel( this.linkLabel3, "北海道", 
                                "http://dir.yahoo.co.jp/Regional/Japanese_Regions/Hokkaido/");

                        this.AddLinkLabel( this.linkLabel3, "東北", 
                                "http://dir.yahoo.co.jp/Regional/Japanese_Regions/Tohoku/");

                        this.AddLinkLabel( this.linkLabel3, "関東", 
                                "http://dir.yahoo.co.jp/Regional/Japanese_Regions/Kanto/");
                }
                
                /// <summary>
                /// linkLabl2 "北海道、東北、関東" の例のリンクラベル挿入のためのメソッド
                /// </summary>
                /// <param name="linkLabel">リンクラベルインスタンス</param>
                /// <param name="word">リンクに変換する文字列</param>
                /// <param name="link">リンク先</param>
                private void AddLinkLabel( System.Windows.Forms.LinkLabel linkLabel, string word, string link )
                {
                        int startIndex = linkLabel.Text.IndexOf(word, 0, linkLabel.Text.Length);
                        linkLabel.Links.Add(startIndex, word.Length, link);
                }
                
                /// <summary>
                /// linkLabl2 "北海道、東北、関東" の例のイベントハンドラ
                /// </summary>
                /// <param name="sender"></param>
                /// <param name="e"></param>
                private void OnHttpLink2(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e)
                { 
                        // this.linkLabel2.LinkVisited = true では、最初の1つだけしか対応できない。
                        // 正しくは、e.Link.Visited = true; とすべき。
                        e.Link.Visited = true;
                        System.Diagnostics.Process.Start(e.Link.LinkData.ToString());
                }

        }
}