DataGridView:リンク列の表示(サンプルあり)

📋 目次(クリックで展開)

DataGridView で一覧画面を表示する際、「商品名をクリックしたら公式ページを開く」「ヘルプのリンクをクリックしたらマニュアルのURLをブラウザで開く」といった、セル内にリンク(ハイパーリンク)を配置したいケースがあります。

DataGridView には標準で DataGridViewLinkColumn というリンク専用の列が用意されていますが、実装時に「クリックしても何も起きない」、「どのイベントに処理を書けばいいのか分からない」などの疑問が生じるかもしれません。また、最新の .NET 環境では、URLをブラウザで開くコードに特有の注意点があります。

今回は、DataGridView にリンク列を追加する基本手順と、クリックされたURLを安全にブラウザで開くための実務的な実装方法について解説します。

1. リンク列(DataGridViewLinkColumn)の基本概念

DataGridView でリンクを表現するには、列の型に DataGridViewLinkColumn を使用します。
この列を使う際、実務でよく使われるパターンは以下の2つです。

  • パターンA:行ごとに異なるURLを表示・クリックさせる
    • データソース(オブジェクト)が保持している https://... という個別の URL 文字列をそのままセルに表示し、クリックさせる一般的な方法です。
  • パターンB:表示する文字は「詳細」等で統一し、裏のURLを開かせる
    • 画面上の見た目はすべての行で「詳細」や「リンク」という文字に統一しておき、クリックされた行の裏データ(隠しプロパティなど)にある URL を開かせる、画面をスッキリ見せたいときの方法です。

今回は、実務で最も汎用性が高く、データの管理もしやすい「パターンA(個別の URL をデータバインドして開く方法)」をベースにしたサンプルコードをご紹介します。

2. 実装コード

以下は、BindingList をデータソースとし、リンク列に表示された URL がクリックされた際に、既定のブラウザでそのページを開くサンプルコードです。

コードを実行する際は、ファイル先頭に using System.Diagnostics; を追加してください。

Form1.cs(画面側の処理)

Form1.cs
using System.ComponentModel;
using System.Diagnostics;
namespace DataGridView_LinkColumn
{
public partial class Form1 : Form
{
private BindingList<SiteModel> _sites = new();
public Form1()
{
InitializeComponent();
InitializeDataGridView();
}
private void InitializeDataGridView()
{
// 1. サンプルデータの登録(表示したいURLをセット)
_sites.Add(new SiteModel("Google", "https://www.google.com"));
_sites.Add(new SiteModel("Microsoft", "https://www.microsoft.com/ja-jp"));
_sites.Add(new SiteModel("watermargin.net", "https://watermargin.net"));
// 2. 手動でリンク列を作成して追加する
var linkCol = new DataGridViewLinkColumn();
linkCol.DataPropertyName = nameof(SiteModel.Url); // モデルのUrlプロパティと連動
linkCol.HeaderText = "参考URL";
linkCol.Name = "UrlLink"; // イベント内で特定するための列名
// リンクの見た目(色のカスタマイズ:任意)
linkCol.LinkColor = Color.Blue;
linkCol.ActiveLinkColor = Color.Red;
linkCol.VisitedLinkColor = Color.Purple;
dataGridView1.Columns.Add(linkCol);
// 3. その他の列を自動生成してデータソースを設定
dataGridView1.DataSource = _sites;
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
// 4. リンクのクリックを検知するイベントを購読
dataGridView1.CellContentClick += DataGridView1_CellContentClick;
}
/// <summary>
/// セルの「中身(テキスト部分)」がクリックされたときに発生するイベント
/// </summary>
private void DataGridView1_CellContentClick(object? sender, DataGridViewCellEventArgs e)
{
// ヘッダー行や、存在しない行インデックスの場合はスキップ
if (e.RowIndex < 0 || e.ColumnIndex < 0) return;
// クリックされた列が、先ほど作成した「UrlLink」列であるかチェック
if (dataGridView1.Columns[e.ColumnIndex].Name == "UrlLink")
{
// セルから URL 文字列を取得
string url = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value?.ToString() ?? "";
if (!string.IsNullOrEmpty(url))
{
// 最新.NET環境に対応した安全なブラウザ起動ロジック
var startInfo = new ProcessStartInfo
{
FileName = url,
UseShellExecute = true // これを True にしないとエラーになります
};
Process.Start(startInfo);
}
}
}
}
}

SiteModel.cs(データモデルクラス)

SiteModel.cs
namespace DataGridView_LinkColumn
{
public class SiteModel
{
public string SiteName { get; set; }
public string Url { get; set; } // リンク列のバインド先
public SiteModel(string siteName, string url)
{
SiteName = siteName;
Url = url;
}
}
}

サンプルアプリケーション

DataGridView_LinkColumn.zip
※ サンプルアプリケーションは、.NET 10 をターゲットに作成しています。

最新の .NET 環境における2つの注意点

DataGridView のリンク列を実装する際、ネット上の旧来の情報をそのまま利用すると、動かない、例外発生によりアプリが終了するという問題に繋がる可能性があります。特に注意すべき2点を解説します。

注意点①:最新 .NET 環境で Process.Start(url) はエラーになる

古い .NET Framework 時代は、Process.Start("https://..."); と書くだけで既定のブラウザが自動で立ち上がっていました。 しかし、.NET Core / .NET 5〜10 などのモダンな最新環境では、セキュリティとクロスプラットフォーム対応の仕様変更により、この書き方だと Win32Exception(指定されたファイルが見つかりません) が発生してクラッシュします。
最新環境で URL をブラウザに認識させるには、サンプルコードのように ProcessStartInfo を生成し、UseShellExecute = true を明示的に指定する必要があります。

注意点②:CellClick ではなく CellContentClick を使うこと

DataGridView には、セルに関わるクリックイベントが複数あります。

  • CellClick:セルの「四角い枠内」であれば、文字のない余白部分をクリックしても反応する。
  • CellContentClick:セルの「中身(文字そのもの)」をクリックしたときだけ反応する。

リンク列の実装では、CellContentClick を使用してください。CellClick を使うと、ユーザーがリンクの文字そのものではなくセル内の空白をクリックした際にもブラウザが立ち上がってしまい、ユーザーの意図しない動作につながる可能性があります。

まとめ

今回は、DataGridView にリンク列(DataGridViewLinkColumn)を追加する方法と、選択された URL をブラウザで開く実装パターンを解説しました。
リンク列は Web システムへ画面遷移できる機能ですが、.NETのバージョンによる動作仕様の変化を受けやすいパーツでもあります。

  1. 文字部分だけを正確に捉えるために CellContentClick を使う。
  2. 最新環境のクラッシュを防ぐために UseShellExecute = true を指定して Process.Start を呼ぶ。

この2点を押さえることで、最新の .NET 環境でもリンク付きの一覧画面を構築することができます。外部システムや Web マニュアルと連携する業務アプリ開発の参考になりましたら幸いです。


💬 コメント