DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataGridViewでのリンク文字について

環境/言語:[vb2005]
分類:[.NET]

DataGridViewの列にリンク文字を入れることは可能でしょうか?

DataGridViewLinkColumnで出来るのかなと思ったのですが、これはハイパーリンクなのか詳しく分かりませんでした。



DataGridViewの中の文字列をクリックすると対応のホームページが開くようにしたいのです。




以下を参考にしています。

「DataGridViewの列にリンクを表示する」
http://dobon.net/vb/dotnet/datagridview/datagridviewlinkcolumn.html
こんにちは。

ハイパーリンクとして使用できますよ。
ただしクリックすれば勝手に発動するわけではなく、イベントが発生するのでイベントハンドラ内で自分で処理を行います。
あくまで、ハイパーリンク風に色がついたり下線がついたり、です。

Dobonさんのサンプルの場合はURLを表示するのではなく全列に「詳細閲覧」と表示されValueもその通りになるため
他の列の値を使う等各種切り替えて色々使う用途ですが、
列のUseColumnTextForLinkValueをFalseにしておいて
連携するDataTableの列をStringにでもしておけばValueに任意のURL用文字列をセットできますから、
そのままそれを使用することができます。
サイトのタイトルを表示しておいて別の列のデータをURLとして使用するのでもよいですし。
まぁそこは好きにすればよいのかなと思います。

ユーザ任意でデータを入力するわけではなく何らかのデータから引っ張ってきてURLをセットするのであれば
とりあえずは安全なので、
以下のように「Process.Start」と簡単に書いてもまぁ大丈夫です。
これで列の値をURLとして既定のブラウザで開くようになります。
Private Sub DataGridView1_CellContentClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _
Handles DataGridView1.CellContentClick
    If TypeOf DataGridView1.Columns(e.ColumnIndex) Is DataGridViewLinkColumn AndAlso Not e.RowIndex = -1 Then
        Select Case DataGridView1.Columns(e.ColumnIndex).Name
            Case "Link"    '…リンク列はこれしかつけてないですが。
                Dim value As Object = DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value
                If value.GetType Is GetType(DBNull) Then Return
                Process.Start(DirectCast(value, String))
            Case Else
        End Select
    End If
End Sub
が、
実際にはURL以外の何でも入りうるわけで、
発動させるデータ列の中身を任意に設定できる場合はこんな処理だと何でもできて危ないので注意してください。
例えば「notepad」と書いてあればメモ帳が起動しますし、
「c:\a.txt」とかすると、a.txtが関連付けされているプログラム(メモ帳等)が起動しますし、
「c:\aaaa.bmp」とかすると、bmpが関連付けされているプログラム(ペイント等)が起動します。
ようは、システムの方で反応するので何でもありになってしまいます。
既定のブラウザのパスを得てそれをProcess.Startする(引数にvalueを使用する)ようにした方がよいでしょう。
2011/11/30(Wed) 04:58:54 編集(投稿者)
2011/11/30(Wed) 04:24:54 編集(投稿者)
2011/11/30(Wed) 04:24:50 編集(投稿者)

とんさん、返信有難う御座います。
また返事が遅くなってすみません。

「上手く出来ました」と結果を書こうと思い試行錯誤していたのですが、なかなか難しいですね・・・

前の段階で戸惑っているのですが、以下のサンプルの写真だと列にColumn1があると思うのですが、実際のコードにはありません。
多分出来て当たり前だろうと言うことだとは思うのですが・・・
http://dobon.net/vb/dotnet/datagridview/datagridviewlinkcolumn.html


DataGridView1.Rows.Addで追加した後にDataGridView1.Columns.Addで追加すると横に増えて行ってしまうので困っています。



現在列が2つあり、

DataGridView1.Rows.Add(ListBox1.Items(hensu), TextBox1.Text)

で2つの列に追加して行っているのですが、サンプルにある

DataGridView1.Columns.Add(column)

も3列目に一緒に追加していきたいのですが、どうしたらいいでしょうか?
サンプルでは「詳細閲覧」がすべてに入るようになっていますが、変数で変えていきたいので、

DataGridView1.Rows.Add(ListBox1.Items(hensu), TextBox1.Text,column)

という風にやってみてもダメでした。
こんにちは。

行が増えるごとにカラムまでAddで増やしてはいけません。当然ですが横に列が増えます。
列の定義については、方法はデザイナからの定義でも直コードでの定義でもよいですが、一度だけでよいです。フォームのLoadとかどこかで。

なお、デザイナから型指定のあるデータセットを指定せずに任意のDataTable等と後からコードで連結するのであれば、
デザイナの「列の編集」等から、各列の.DataPropertyNameに連携先のDataTable等の列名を記述しておいてください。
そうしない列はDataTableとの連携相手が指定されていないままになるので取り残され、DataTableの列と同じ列が余分にできてしまいます。

※型指定のないものを相手にデザイナから列の定義を行う場合、「列の追加」を使うと出てくる設定項目が少なくDataPropertyNameも出てきませんから
二度手間になるので、はなから「列の編集」か「Columns」の方を押してください。


(…現在ある二つの列は、どこで定義したのですか?そこでもうひとつ分も定義してください。)
とん。さん、返信遅くなってすみません。


> 行が増えるごとにカラムまでAddで増やしてはいけません。当然ですが横に列が増えます。

なるほど、これが原因でしたね。
おかげで、この問題は解決できました。



> (…現在ある二つの列は、どこで定義したのですか?そこでもうひとつ分も定義してください。)

有難うございます。
出来ましたら、また報告させて頂きます。


テストしてみます。

DOBON.NET | プログラミング道 | プログラミング掲示板