C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: DataGridView・セル結合におけるリンク文字表示


(過去ログ 130 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■77210 / inTopicNo.1)  DataGridView・セル結合におけるリンク文字表示
  
□投稿者/ ホシ蔵 (1回)-(2015/09/26(Sat) 10:07:00)

分類:[C#] 

2015/09/26(Sat) 10:14:20 編集(投稿者)
お世話になります。

下記環境にて、DataGridViewを用いた表の作成を行なっております。

(使用環境)
言語:C#
フレームワーク:.net
IDE:Microsoft Visual Studio
GUI-API:Windows Forms

<課題>
表に出力するレコードの一部で2段表示したい部分があり、セルの結合までは
出来ましたが、結合したセルに表示する文字をリンクにすることができません。

やりたいことのイメージは下記参考URLの感じになります。

(参考URL)
http://arayan-jp.blogspot.jp/2009/05/c-datagridview_21.html

上記ページで表(Form1)のColumn1(結合されたセル)があると思いますが、
その中の文字をリンク文字にしたいのです・・・。

ソースが記載されており、下記の部分

---------------- 一部抜粋 ----------------
 TextRenderer.DrawText(e.Graphics,
      e.FormattedValue.ToString(),
      e.CellStyle.Font, rect, e.CellStyle.ForeColor,
      TextFormatFlags.HorizontalCenter
      | TextFormatFlags.VerticalCenter);
------------------------------------------

で文字の描画を行なっており、恐らく上記の箇所を
上手く変更すればリンクになるのかな・・・と
あれこれやっておりますが解決しないのが現状です。


セルを独自に描画してリンク文字を挿入する方法や、
また、上記例とは違ったやり方など何が分かる方が
いらっしゃいましたらご教授をお願い致します。

引用返信 編集キー/
■77211 / inTopicNo.2)  Re[1]: DataGridView・セル結合におけるリンク文字表示
□投稿者/ WebSurfer (654回)-(2015/09/26(Sat) 10:54:50)
No77210 (ホシ蔵 さん) に返信

回答ではなく質問ですみませんが・・・

Visual Studio のウィザード(DataGridView の[列の編集]画面)で、
列の ColumnType を DataGridViewLinkBoxColumn に変更したいけど、
セルを結合したのでそれがウィザードベースではできないということな
のでしょうか?

ハズレだったら失礼しました。
引用返信 編集キー/
■77213 / inTopicNo.3)  Re[2]: DataGridView・セル結合におけるリンク文字表示
□投稿者/ ホシ蔵 (2回)-(2015/09/26(Sat) 13:36:16)
No77211 (WebSurfer さん) に返信
WebSurfer さん 
ご返信ありがとうございます。

> Visual Studio のウィザード(DataGridView の[列の編集]画面)で、
> 列の ColumnType を DataGridViewLinkBoxColumn に変更したいけど、
> セルを結合したのでそれがウィザードベースではできないということな
> のでしょうか?

はい、列の属性を DataGridViewLinkBoxColumn に設定し、
セルを結合後、文字を出力しても文字部分がリンクになりませんでした。

文字列出力時に文字にリンクの属性を付加したい、といったニュアンスです。

以上、宜しくお願い致します。
引用返信 編集キー/
■77219 / inTopicNo.4)  Re[3]: DataGridView・セル結合におけるリンク文字表示
□投稿者/ WebSurfer (656回)-(2015/09/28(Mon) 15:24:48)
No77213 (ホシ蔵 さん) に返信

レスが遅くなりました。

> はい、列の属性を DataGridViewLinkBoxColumn に設定し、
> セルを結合後、文字を出力しても文字部分がリンクになりませんでした。
> 文字列出力時に文字にリンクの属性を付加したい、といったニュアンスです。

「リンクの属性」というのが何を意味しているのか分かりませんが、(1) 文字がアンダー
ライン付き青文字となり、(2) 文字をマウスでポイントするとマウスカーソルが指型に変
わり、(4) 文字をマウスでクリックすると当該 DataGridViewLinkCell の LinkVisited 
が true になり、(5) Visit した文字の色が変わる・・・という理解でいいのでしょうか?

上記 (2) はデザイナで当該列の ColumnType を DataGridViewLinkColumn に変更すれば
自動的にそうなると思います。

上記 (1) と (5) は CellPainting イベントのハンドラで文字を書くときにそのように
してはいかがですか? 以下のような感じです(あくまで「感じ」なのでご自分のコード
にあわせて適宜変更してください)。

private void customersDataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (this.customersDataGridView.Columns["dataGridViewTextBoxColumn3"].Index == e.ColumnIndex && e.RowIndex >= 0)
    {
        using (
            Brush gridBrush = new SolidBrush(this.customersDataGridView.GridColor),
            backColorBrush = new SolidBrush(e.CellStyle.BackColor))
        {
            using (Pen gridLinePen = new Pen(gridBrush))
            {
                e.Graphics.FillRectangle(backColorBrush, e.CellBounds);

                e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left,
                    e.CellBounds.Bottom - 1, e.CellBounds.Right - 1,
                    e.CellBounds.Bottom - 1);
                e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1,
                    e.CellBounds.Top, e.CellBounds.Right - 1,
                    e.CellBounds.Bottom);

                Font font = new Font(e.CellStyle.Font, FontStyle.Underline);

                StringFormat format1 = new StringFormat()
                {
                    FormatFlags = StringFormatFlags.NoWrap,
                    Alignment = StringAlignment.Near,
                    LineAlignment = StringAlignment.Center,
                    Trimming = StringTrimming.EllipsisCharacter
                };

                if (e.Value != null)
                {
                    // Visited Cell の文字の色を変える。
                    DataGridViewLinkCell cell = (DataGridViewLinkCell)this.customersDataGridView[e.ColumnIndex, e.RowIndex];
                    if (cell.LinkVisited)
                    {
                        e.Graphics.DrawString((String)e.Value, font,
                            Brushes.Crimson, e.CellBounds, format1);
                    }
                    else
                    {
                        e.Graphics.DrawString((String)e.Value, font,
                            Brushes.Blue, e.CellBounds, format1);
                    }
                }
                e.Handled = true;
            }
        }                
    }
}

上記 (4) は CellContentClick イベントのハンドラで処置できると思います。以下のよう
な感じです(これもあくまで「感じ」です)。

private void customersDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    if (this.customersDataGridView.Columns["dataGridViewTextBoxColumn3"].Index == e.ColumnIndex && e.RowIndex >= 0)
    {
        DataGridViewLinkCell cell = (DataGridViewLinkCell)this.customersDataGridView[e.ColumnIndex, e.RowIndex];
        cell.LinkVisited = true;
    }
}

もっとスマートな方法があるかもしれません。他の方の回答もお待ちください。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -