Gustav Brock
Gustav at cactus.dk
Wed Dec 1 06:24:03 CST 2010
Hi Shamil I see. If you didn't need to draw your +/- you could just remove the row headers. Or could you do that and then use column 0 to simulate the row headers? This: http://webcache.googleusercontent.com/search?q=cache:lC1xHEMKuvUJ:dotnet.itags.org/web-forms/121172/+%22C%23%22+DataGridView+show+rowselector+arrow&cd=7&hl=da&ct=clnk&gl=dk located in the Google cache suggests: Handle the RowPostPaint event (Code Snippet): void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) { e.PaintHeader(DataGridViewPaintParts.All & ~DataGridViewPaintParts.ContentBackground); } Also, I located this thread which, however, perhaps collides with your +/- drawing: http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/346e5839-1813-472b-8b3a-7344118819b3 You may have seen it before (I just googled) but the topic seems pretty close to that of yours. /gustav >>> shamil at smsconsulting.spb.ru 01-12-2010 12:49 >>> Gustav -- I have currently used - Form.DefaultBackColor - that helped as my form backcolor is the same as gridview's rowheaders backcolor (see code below) - I'd still be interested is there a way to use .RowHeader cell's Style.BackColor to paint row header background without row selection arrow. There should be a "trick" I'm missing as .RowHeader cell's Style.BackColor is equal to [Control] system color, which is R(0),G(0),B(0) when you get it via code but it's in fact a very light gray color here. The trick should be somehow related to the fact that I'm getting Graphics (g variable) from GridView Handle, and then Style.BackColor becomes invisible - I should probably get Graphics somehow else or convert color before using it but I do not know how... private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) { PlusMinusDrawer.Draw(dataGridView1, e, true, Form.DefaultBackColor); } ..... public class PlusMinusDrawer { public static void Draw(DataGridView grid, DataGridViewRowPostPaintEventArgs e, bool drawPlus, Color givenBackColor) { DataGridViewCell cell = null; Color usedBackColor = Color.LightGray; if (givenBackColor != null) usedBackColor = givenBackColor; if (e.RowIndex == 0) { cell = grid.TopLeftHeaderCell; //usedBackColor = cell.Style.BackColor; drawPlusMinus(cell, 0, drawPlus, usedBackColor); } DataGridViewCell cell1 = grid.Rows[e.RowIndex].HeaderCell; //usedBackColor = cell1.Style.BackColor; drawPlusMinus(cell1, e.RowBounds.Y, drawPlus, usedBackColor); } private static void drawPlusMinus(DataGridViewCell cell, int offsetY, bool drawPlus, Color backColor) { Graphics g = null; System.Drawing.Pen pen = null; Brush brush = null; try { DataGridView grid = cell.DataGridView; Rectangle headerBounds = new Rectangle(2, offsetY + 2, cell.Size.Width - 4, cell.Size.Height - 4); brush = new System.Drawing.SolidBrush(backColor); g = Graphics.FromHwnd(grid.Handle); pen = new System.Drawing.Pen(Color.Black, 2F); g.FillRectangle(brush, headerBounds); int offsetX = 0; int padX = 2; int padY = 2; int h2 = cell.Size.Height - padY * 2; int w2 = grid.RowHeadersWidth - padX * 2; int h = h2 / 2; int w = w2 / 2; int height = 14; // vertical line height int width = 14; // horisontal line width System.Drawing.Point[] p = new System.Drawing.Point[4]; // horizontal line p[0].X = 0 + offsetX + w - width / 2 + padY; p[0].Y = h + offsetY + padY; p[1].X = 0 + offsetX + w + width / 2 + padY; p[1].Y = h + offsetY + padY; g.DrawLine(pen, p[0], p[1]); if (drawPlus) { // vertical line p[2].X = w + offsetX + padX; p[2].Y = 0 + offsetY + padY + h - height / 2; p[3].X = w + offsetX + padX; p[3].Y = 0 + offsetY + padY + h + height / 2; g.DrawLine(pen, p[2], p[3]); } } finally { if (brush!= null) brush.Dispose(); if (pen != null) pen.Dispose(); if (g != null) g.Dispose(); } } } Thank you. -- Shamil -----Original Message----- From: Shamil Salakhetdinov [mailto:shamil at smsconsulting.spb.ru] Sent: 1 ??????? 2010 ?. 14:25 To: 'Discussion concerning Visual Basic and related programming issues.' Subject: RE: [dba-VB] WinForms: What is the best event for custom drawing ona leftmost cell of DataGridView head Hi Gustav -- Thank you for your sample code. I have to simulate hierarchical GridView (just one level) using DataGridView (I do not use third-party controls - that's my customer requirement). I do use RowPostPaint event to draw (+) - collpased , and (-) - expanded row sign on row header cells as well as on top-left cell - the latter is used to note/control collapsed/expanded datagridview rows on first level. All works fine except that I cannot find how to suppress/hide row selector arrow - when I use: - DataGridViewCell's .Style.BackColor to paint RowHeader cell's background - SelectionMode = CellSelect - ShowEditingIcon = False the record selector is still visible. I have to use custom color - Color.LightGray to paint it over. Thank you. -- Shamil