Serialcoder en Français Serialcoder in English
TEL : +33 (0)9 72 13 15 17

Windows Forms FAQ resources

5. Windows Forms Datagrid

5.38 How can I get celltips or tooltips to vary from cell to cell in my DataGrid?


One way to do this is to use a ToolTip control and reset the control text as the mouse moves from cell to cell. Below is a derived DataGrid class that implements this idea. The main points are:

  • Have members that track the current hitRow and hitCol where the mouse is.
  • In a MouseMove handler, do a HitTest on the mouse location to see if there is a new hit cell. If so, set the hitRow & hitCol, and hook the tooltip to hold your text according to the cell. In our sample, we just display the string value of the grid cell.
  • Finally, in the MouseMove handler, after setting a new text in the tooltip, set the tooltip active so it can show itself in due time.

public class DataGridCellTips : DataGrid
{
     private int hitRow;
     private int hitCol;
     private System.Windows.Forms.ToolTip toolTip1;

     public DataGridCellTips()
     {
          hitRow = -1;
          hitCol = -1;
          this.toolTip1 = new System.Windows.Forms.ToolTip();
          this.toolTip1.InitialDelay = 1000;
          this.MouseMove += new MouseEventHandler(HandleMouseMove);
     }

     private void HandleMouseMove(object sender, MouseEventArgs e)
     {
          DataGrid.HitTestInfo hti = this.HitTest(new Point(e.X, e.Y));
          if(hti.Type == DataGrid.HitTestType.Cell
               && ( hti.Row != hitRow || hti.Column != hitCol) )
          {     //new hit row
               hitRow = hti.Row;
               hitCol = hti.Column;
               if(this.toolTip1 != null && this.toolTip1.Active)
                    this.toolTip1.Active = false; //turn it off
               this.toolTip1.SetToolTip(this, this[hitRow, hitCol].ToString());
               this.toolTip1.Active = true; //make it active so it can show itself
               //Console.WriteLine("MouseMove "+ hitRow.ToString() + " " + hitCol.ToString());
          }
     }
}