LinkLabel

ハイパーリンクを表示できるLabelコントロールです。

クラス階層

  • System.ComponentModel.Component
    • System.Windows.Forms.Control
      • System.Windows.Forms.Label
        • System.Windows.Forms.LinkLabel

プロパティ

プロパティ 内容
LinkBehavior LinkBehavior リンクの動作
  • SystemDefault … Internet Explorerの[インターネット オプション]の設定に依存
  • AlwaysUnderline … 常にリンクは下線付き
  • HoverUnderline … マウスがテキストの上にあるときだけ、リンクは下線付き
  • NeverUnderline … 下線なし
string Text LinkLabelで表示されるテキスト
LinkCollection Links LinkLabel内に格納されているリンク (LinkLabel.Link) のコレクション

Textプロパティはその部分文字列ごとにリンクを設定できるため、それらのコレクション

LinkArea LinkArea テキスト内でリンクとして処理される領域。Linksプロパティの最初の要素の領域。LinkArea.Startが先頭位置、LinkArea.Lengthが文字数を表す
Color LinkColor 通常のリンクを表示するときに使用する色。既定の色はシステムで指定されている色であり、通常はColor.Blue
Color VisitedLinkColor 以前にリンク先に移動したことのあるリンクを表示するときに使用する色。既定の色はシステムで指定されている色であり、通常はColor.Purple
Color ActiveLinkColor アクティブなリンクを表示するために使用する色。既定の色はシステムで指定されている色であり、通常はColor.Red
Color DisabledLinkColor 無効なリンクを表示するときに使用する色。既定値はEmpty
bool UseMnemonic trueならば、「&」に続く文字がアクセスキーとなる
     
プロパティ - LinkLabel クラス (System.Windows.Forms) | Microsoft Learn

Links

リンクのコレクションを操作できます。LinkLabel.Links プロパティ (System.Windows.Forms) | Microsoft Learn

linkLabel = new LinkLabel();
int count1 = linkLabel.Links.Count; // 1

linkLabel.Text = "012345";          // "012345"の範囲がリンクとなる
int count2 = linkLabel.Links.Count; // 1

linkLabel.Links.Add(1, 2);          // "12"の範囲だけがリンクとなる
linkLabel.Links.Add(4, 2);          // "45"の範囲にリンクが追加される
int count3 = linkLabel.Links.Count; // 2

文字列の長さを超えてリンクを設定すると、その範囲は無視されます。すでにリンクが設定されている範囲に重複して指定すると、「オーバーラップしたリンク部分です。」としてInvalidOperationExceptionが投げられます。

リンク数の上限

リンクは31個までしか追加できません。これが32個以上になると「オーバーフロー エラーです。」として、OverflowExceptionが投げられます。

linkLabel.Links.Clear();
linkLabel.Text = new String('A', 100);

for (int i = 0; i < 100; i++)
{
    linkLabel.Links.Add(i, 1); // iが31のときに、OverflowExceptionが投げられる
}

これはLinkLabel.CreateStringFormat()から呼び出される、StringFormat.SetMeasurableCharacterRanges()の制約によるものです。c# - More than 32 links in LinkLabel? - Stack Overflow

データの関連付け

リンクのコレクションのLink.LinkDataに情報を設定しておくと、LinkClickedイベントのハンドラでそれを取得できます。

linkLabel.Text = "0123456789";

linkLabel.LinkArea = new LinkArea(0, 2); // リンクの領域を"01"の範囲に設定
linkLabel.Links[0].LinkData = "A";       // リンクの領域に"A"という情報を付加

linkLabel.Links.Add(3, 2, "B"); // リンクの領域を"34"の範囲に設定し、"B"という情報を付加
linkLabel.Links.Add(6, 2, "C"); // リンクの領域を"67"の範囲に設定し、"C"という情報を付加

リンクの削除

LinkLabel.LinkCollection.Clear()で、すべてのリンクを削除できます。

linkLabel.Links.Clear();

リンクが追加されたことを表すLinkLabel.LinkCollection.LinksAddedは、リンクが追加された時点でフラグが立てられるだけのため、追加したリンクを削除してもtrueのままとなります。 LinkLabel.LinkCollection.LinksAdded Property (System.Windows.Forms) | Microsoft Learn LinksAdded - LinkLabel.cs

UseMnemonic

アクセスキー (access key) はLabelと同様に、次のコントロールにフォーカスを合わせるように作用します。これをリンクのクリックとするにはLinkLabelを継承したクラスを作成し、ProcessMnemonic()をオーバーライドします。

protected override bool ProcessMnemonic(char charCode)
{
    if (base.ProcessMnemonic(charCode))
    {
        if (Links.Count == 1)
        {
            Link link = Links[0]; // リンクが複数設定されているならば、それを特定する必要がある
            OnLinkClicked(new LinkLabelLinkClickedEventArgs(link));
        }
        return true;
    }
    return false;
}
c# - Using keyboard shortcuts with LinkLabel controls - Stack Overflow

イベント

基本クラスであるLabelに対して、追加されたイベントは下表の2つです。

イベント 発生タイミング
LinkLabelLinkClickedEventHandler LinkClicked リンクがクリックされたとき。Clickイベントとは異なり、クリックされた位置のLinkLabel.Linkを取得できる
EventHandler TabStopChanged TabStopプロパティの値が変化したとき

LinkClicked

左ボタン以外のクリックでも発生し、押されたボタンはLinkLabelLinkClickedEventArgs.Buttonで取得できます。

LinkLabel.LinkClicked イベント (System.Windows.Forms) | Microsoft Learn

private void linkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
    object obj = e.Link.LinkData;
}
Microsoft Learnから検索