Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9301

C# DataGridViewのセルのToolTipをカスタマイズする方法

$
0
0

概要

DataGridViewのセルにカーソルを合わせたときに表示されるToolTipの見た目のカスタマイズ方法です。
カスタマイズ後のイメージが以下になります。
ToolTipにはセルのX、Y座標とセルの値を表示しています。
背景を黒で塗りつぶして文字と枠線を白にしています。
さらにフォントもデフォルトより大きくしています。

通常カスタマイズ
image.pngimage.png

環境

  • Visual Studio 2019
  • .Net Framework 4.8

コード

ToolTipコントロールを作成し、OwnerDraw、ShowAlwaysプロパティにtrueを設定します。
Draw、Popupにイベントを設定します。
ここまではデザイナを使用して行っても構いません。

次にDataGridViewのtoolTip変数に作成したToolTipコントロールを設定します。
DataGridViewのtoolTipはプロパティが無いので、GetFieldメソッドやSetValueメソッドを使用して設定しています。

  • DataGridViewからtoolTipControlを取得
  • toolTipControlからtoolTipを取得
  • toolTipに作成したToolTipコントロールを設定
privatevoidForm1_Load(objectsender,EventArgse){this.InitDataGridView();varcellToolTip=newToolTip();cellToolTip.OwnerDraw=true;cellToolTip.ShowAlways=true;cellToolTip.Draw+=newDrawToolTipEventHandler(this.CellToolTip_Draw);cellToolTip.Popup+=newPopupEventHandler(this.CellToolTip_Popup);vartoolTipControl=this.dataGridView1.GetType().GetField("toolTipControl",System.Reflection.BindingFlags.Instance|System.Reflection.BindingFlags.NonPublic).GetValue(this.dataGridView1);vartoolTip=toolTipControl.GetType().GetField("toolTip",System.Reflection.BindingFlags.Instance|System.Reflection.BindingFlags.NonPublic);toolTip.SetValue(toolTipControl,cellToolTip);}

CellFormattingイベントでセルのToolTipTextプロパティに表示させたい内容を設定します。
今回はセルのX、Y座標とセルの値を設定しています。

privatevoidTargetDataGridView_CellFormatting(objectsender,DataGridViewCellFormattingEventArgse){if(e.ColumnIndex>=0&&e.RowIndex>=0){varcell=this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];cell.ToolTipText=$"(X={e.ColumnIndex}, Y={e.RowIndex}){Environment.NewLine}";cell.ToolTipText+=$"Value={e.Value}";}}

フォントを変更すると表示領域のサイズも変化する可能性があるため、PopupイベントでToolTipのサイズを設定します。

privatevoidCellToolTip_Popup(objectsender,PopupEventArgse){e.ToolTipSize=newSize(e.ToolTipSize.Width+30,e.ToolTipSize.Height+9);}

DrawイベントでToolTipの描画部分を記述します。
塗りつぶしや枠線、文字の色、文字のフォントなどをここで設定します。
枠線のコードを省略すると枠線なしのToolTipになります。

privatevoidCellToolTip_Draw(objectsender,DrawToolTipEventArgse){ColorbackColor=Color.Black;ColorborderColor=Color.White;ColorforeColor=Color.White;//塗りつぶしusing(SolidBrushbrush=newSolidBrush(backColor))e.Graphics.FillRectangle(brush,e.Bounds);//枠線using(Penpen=newPen(borderColor))e.Graphics.DrawRectangle(pen,newRectangle(e.Bounds.X,e.Bounds.Y,e.Bounds.Width-1,e.Bounds.Height-1));//テキスト描画using(Fontfont=newFont("Meiryo UI",10f))TextRenderer.DrawText(e.Graphics,e.ToolTipText,font,e.Bounds,foreColor,TextFormatFlags.HorizontalCenter|TextFormatFlags.VerticalCenter);}

コード全体です。
InitDataGridViewメソッドでDataGridViewの設定と行列を追加しています。
RandomStringメソッドはDataGridViewのセルの値を作成しています。

usingSystem;usingSystem.Drawing;usingSystem.Linq;usingSystem.Windows.Forms;namespaceDataGridViewSample{publicpartialclassForm1:Form{privateRandom_Random=newRandom();publicForm1(){InitializeComponent();}privatevoidForm1_Load(objectsender,EventArgse){try{this.InitDataGridView();varcellToolTip=newToolTip();cellToolTip.OwnerDraw=true;cellToolTip.ShowAlways=true;cellToolTip.Draw+=newDrawToolTipEventHandler(this.CellToolTip_Draw);cellToolTip.Popup+=newPopupEventHandler(this.CellToolTip_Popup);vartoolTipControl=this.dataGridView1.GetType().GetField("toolTipControl",System.Reflection.BindingFlags.Instance|System.Reflection.BindingFlags.NonPublic).GetValue(this.dataGridView1);vartoolTip=toolTipControl.GetType().GetField("toolTip",System.Reflection.BindingFlags.Instance|System.Reflection.BindingFlags.NonPublic);toolTip.SetValue(toolTipControl,cellToolTip);}catch(Exceptionex){MessageBox.Show(ex.Message);}}privatevoidTargetDataGridView_CellFormatting(objectsender,DataGridViewCellFormattingEventArgse){try{if(e.ColumnIndex>=0&&e.RowIndex>=0){varcell=this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];cell.ToolTipText=$"(X={e.ColumnIndex}, Y={e.RowIndex}){Environment.NewLine}";cell.ToolTipText+=$"Value={e.Value}";}}catch(Exceptionex){MessageBox.Show(ex.Message);}}privatevoidCellToolTip_Popup(objectsender,PopupEventArgse){e.ToolTipSize=newSize(e.ToolTipSize.Width+30,e.ToolTipSize.Height+9);}privatevoidCellToolTip_Draw(objectsender,DrawToolTipEventArgse){try{ColorbackColor=Color.Black;ColorborderColor=Color.White;ColorforeColor=Color.White;//塗りつぶしusing(SolidBrushbrush=newSolidBrush(backColor))e.Graphics.FillRectangle(brush,e.Bounds);//枠線using(Penpen=newPen(borderColor))e.Graphics.DrawRectangle(pen,newRectangle(e.Bounds.X,e.Bounds.Y,e.Bounds.Width-1,e.Bounds.Height-1));//テキスト描画using(Fontfont=newFont("Meiryo UI",10f))TextRenderer.DrawText(e.Graphics,e.ToolTipText,font,e.Bounds,foreColor,TextFormatFlags.HorizontalCenter|TextFormatFlags.VerticalCenter);}catch(Exceptionex){MessageBox.Show(ex.Message);}}/// <summary>/// DataGridViewの初期設定/// </summary>privatevoidInitDataGridView(){try{intcolCount=20;introwCount=20;intcellWidth=20;this.dataGridView1.ReadOnly=true;this.dataGridView1.AllowUserToAddRows=false;this.dataGridView1.DefaultCellStyle.Alignment=DataGridViewContentAlignment.MiddleCenter;this.dataGridView1.RowHeadersDefaultCellStyle.Alignment=DataGridViewContentAlignment.MiddleRight;this.dataGridView1.RowHeadersWidth=50;//列追加varcols=Enumerable.Range(0,colCount).Select(idx=>newDataGridViewTextBoxColumn{Name=idx.ToString(),Width=cellWidth,});this.dataGridView1.Columns.AddRange(cols.ToArray());//行追加foreach(introwIdxinEnumerable.Range(0,rowCount)){this.dataGridView1.Rows.Add(this.RandomString(rowCount).Cast<object>().ToArray());this.dataGridView1.Rows[rowIdx].HeaderCell.Value=rowIdx.ToString();}}catch(Exception){throw;}}/// <summary>/// ランダムな文字列を作成します。/// </summary>/// <param name="length">文字列長</param>/// <returns></returns>publicstringRandomString(intlength){conststringchars="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";returnnewstring(Enumerable.Repeat(chars,length).Select(s=>s[this._Random.Next(s.Length)]).ToArray());}}}

まとめ

仕事でDataGridViewのToolTipのフォントサイズを変更したくて方法を調べました。
CellToolTipTextNeededイベントを使用する方法が見つかりましたが、DataSourceプロパティが設定されているか、VirtualModeプロパティがtrueの場合にのみこのイベントが発生するようです。
なので今回の例のようにDataGridViewに直接行列を追加している場合はイベントが発生しませんでした。

試行錯誤していて、DataGridViewのちらつきを防止するときに使用するDoubleBufferedにアクセスする方法と同じ方法でDataGridViewのToolTipにアクセスできるのではないか?と思いつき、今回の方法を考え付きました。


Viewing all articles
Browse latest Browse all 9301

Trending Articles