.NET DataGridView: Remove "current row" black triangle

Triangle problem , it's simple ,put

dgv_Products.Rows[xval].Selected = true;
dgv_Products.CurrentCell  = dgv_Products.Rows[xval].Cells[0];

that is make current cell property to the cell zero of current selected row.( Tested working for dgv_Products.MultiSelect = false ; )


Set RowHeadersVisible to false.


A very simple solution is to set the row height to 16 pixels or less. This disables all icons in the row header cell.

dataGridView1.RowTemplate.Height = 16;

  • If you want to keep the row headers rather than hide them, then you can use the cell padding to push the triangle out of sight:

    this.dataGridView1.RowHeadersDefaultCellStyle.Padding = 
        new Padding(this.dataGridView1.RowHeadersWidth);
    
  • If you are using row header text and want keep that visible you need to use some custom painting - thankfully very simple. After the above code, simply attach to the RowPostPaint event as shown below:

    dataGridView1.RowPostPaint += 
        new DataGridViewRowPostPaintEventHandler(dataGridView1_RowPostPaint);
    

    And in the RowPostPaint method:

    void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
    {
        object o = dataGridView1.Rows[e.RowIndex].HeaderCell.Value;
    
        e.Graphics.DrawString(
            o != null ? o.ToString() : "",
            dataGridView1.Font, 
            Brushes.Black, 
            new PointF((float)e.RowBounds.Left + 2, (float)e.RowBounds.Top + 4));
    }
    

    As Dan Neely points out the use of Brushes.Black above will overwrite any existing changes, so it is better for the brush to use:

    new SolidBrush(dataGridView1.RowHeadersDefaultCellStyle.ForeColor)