Many times you want to select multiple columns in a DataGrid and highlight the columns selected.
In the DataGrid MouseDown Event you will find out if you have selected a column header through the hit test. You then find the co-ordinate of the column and construct a rectangle out of that. If you are selecting multiple columns you can store the index of the columns and the rectangle in ArrayList.
Make sure you clear the ArrayList when you HitType is None.
protected void dataGrid1_MouseDown (object sender, System.Windows.Forms.MouseEventArgs e)
{
m_HitTest = dataGrid1.HitTest(e.X,e.Y);
if ( m_HitTest.Type == DataGrid.HitTestType.ColumnHeader )
{
int xCoordinate = this.GetLeftmostColumnHeaderXCoordinate( m_HitTest.Column );
int yCoordinate = this.GetTopmostColumnHeaderYCoordinate( e.X, e.Y );
int columnWidth = dataGrid1.TableStyles[0].GridColumnStyles
m_HitTest.Column].Width;
int columnHeight = this.GetColumnHeight( yCoordinate );
columnRegion = new Rectangle( xCoordinate, yCoordinate, columnWidth, columnHeight );
m_RectangleOfSelectedColumns.Add(columnRegion);
m_IndexOfSelectedColumns.Add(m_HitTest.Column);
}
else if(m_HitTest.Type == DataGrid.HitTestType.None)
{
this.m_RectangleOfSelectedColumns.Clear();
m_IndexOfSelectedColumns.Clear();
this.dataGrid1.Refresh();
}
}
In the DataGrid paint method you just fill the rectangles you contructed before in MouseDown Event.
private void dataGrid1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
if (m_HitTest != null && m_HitTest.Type == DataGrid.HitTestType.ColumnHeader )
{
for (int i = 0; i < this.m_RectangleOfSelectedColumns.Count; i++)
{
Rectangle columnRegion = (Rectangle)m_RectangleOfSelectedColumns[i];
SolidBrush blackBrush = new SolidBrush( Color.FromArgb( 255, 0, 0, 0 ) );
SolidBrush darkGreyBrush = new SolidBrush( Color.FromArgb( 100, 229, 229, 229 ) );
Pen blackPen = new Pen( blackBrush, 1F );
g.FillRectangle( darkGreyBrush, columnRegion);
g.DrawRectangle( blackPen, columnRegion );
}
}
}
You will get result like below.