|
■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;
}
}
もっとスマートな方法があるかもしれません。他の方の回答もお待ちください。
|