.NET DataGridView: удалить черный треугольник "текущая строка"

В DataGridView, даже если вы установили сетку как только для чтения, в заголовках строк отображается черный треугольник, который отображается в текущей строке.

Я бы хотел, чтобы это не было показано, также я бы хотел избежать большого заполнения этих ячеек, вызванного треугольником. Я предполагаю, что заполнение вызвано треугольником, потому что заполнение ячейки равно 0.

Можно ли это сделать? Как?

Спасибо!

Edit

Вот как создается текст заголовков строк:

for (int i = 0; i < 5; i++)
{
    DataGridViewRow row = new DataGridViewRow();
    row.HeaderCell.Value = headers[i];
    dataGridView1.Rows.Add(row);
}

и headers - это просто массив строк. (string[])

Ответы

Ответ 1

  • Если вы хотите сохранить заголовки строк, а не скрывать их, то вы можете использовать заполнение ячейки, чтобы вывести треугольник из поля зрения:

    this.dataGridView1.RowHeadersDefaultCellStyle.Padding = 
        new Padding(this.dataGridView1.RowHeadersWidth);
    
  • Если вы используете текст заголовка строки и хотите сохранить видимость, вам нужно использовать какую-то пользовательскую картину - к счастью, очень просто. После этого кода просто присоедините к событию RowPostPaint, как показано ниже:

    dataGridView1.RowPostPaint += 
        new DataGridViewRowPostPaintEventHandler(dataGridView1_RowPostPaint);
    

    И в методе RowPostPaint:

    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));
    }
    

    Как указывает Дан Нили, использование Brushes.Black выше перезапишет любые существующие изменения, поэтому лучше использовать кисть:

    new SolidBrush(dataGridView1.RowHeadersDefaultCellStyle.ForeColor)
    

Ответ 2

Установите RowHeadersVisible в false.

Ответ 3

Очень простое решение - установить высоту строки до 16 пикселей или меньше. Это отключает все значки в ячейке заголовка строки.

dataGridView1.RowTemplate.Height = 16;

Ответ 4

Если кто-то все еще хочет знать:

dataGridView1.RowHeadersWidth = 4; // the left row header size.

Это уберет треугольник и уменьшит размер по умолчанию.

Надеюсь, что это поможет.

Ответ 5

В DataGridViewRowPostPaintEventArgs указан этот метод PaintHeader:

PaintHeader(DataGridViewPaintParts) - Paints the specified parts of the row header of the current row.

Это перечисление DataGridViewPaintParts: https://msdn.microsoft.com/en-us/library/ms159092%28v=vs.110%29.aspx

Итак, что вы делаете в своем событии RowPostPaint в datagridview, сначала скажите, чтобы он рисовал только заголовок строки... так:

e.PaintHeader(DataGridViewPaintParts.Background)

Затем скажите, чтобы рисовать любую строку, в которой вы хотите. Вот мой пример:

Private Sub MyDGV_RowPostPaint(sender As Object, e As DataGridViewRowPostPaintEventArgs) Handles dgvData.RowPostPaint

    Dim grid As DataGridView = DirectCast(sender, DataGridView)

    e.PaintHeader(DataGridViewPaintParts.Background)

    Dim rowIdx As String = (e.RowIndex + 1).ToString()

    Dim rowFont As New System.Drawing.Font("Segoe UI", 9.0!, _
        System.Drawing.FontStyle.Bold, _
        System.Drawing.GraphicsUnit.Point, CType(0, Byte))

    Dim centerFormat = New StringFormat()
    centerFormat.Alignment = StringAlignment.Far
    centerFormat.LineAlignment = StringAlignment.Near

    Dim headerBounds As Rectangle = New Rectangle(e.RowBounds.Left, e.RowBounds.Top, grid.RowHeadersWidth, e.RowBounds.Height)

    e.Graphics.DrawString(rowIdx, rowFont, SystemBrushes.ControlText, headerBounds, centerFormat)

End Sub

Ответ 6

Проблема треугольника, это просто, поместите

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

который делает текущее свойство ячейки для ячейки нулевой текущей выбранной строки. (Протестировано для dgv_Products.MultiSelect = false;)

Ответ 7

dataGridView1.CurrentCell = null;

Полностью удалит черную стрелку.

Вам нужно запускать эту строку каждый раз, когда обновляются данные в DataGridView.

Ответ 8

Пробовал другие ответы, но я не смог сопоставить внешний вид шрифта с шрифтом столбцов. И я нашел решение на форумах Microsoft

Сначала подпишитесь на DataGridView.CellPainting как;

dgv.CellPainting += Dgv_CellPainting;

Затем напечатайте текст, что вы хотите (исходное сообщение имеет индекс строки);

private void Dgv_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            if (e.ColumnIndex == -1 && e.RowIndex > -1)
            {
                object o = (sender as DataGridView).Rows[e.RowIndex].HeaderCell.Value;
                e.PaintBackground(e.CellBounds, true);

                using (SolidBrush br = new SolidBrush(Color.Black))
                {
                    StringFormat sf = new StringFormat();
                    sf.Alignment = StringAlignment.Center;
                    sf.LineAlignment = StringAlignment.Center;
                    e.Graphics.DrawString(o.ToString(),
                    e.CellStyle.Font, br, e.CellBounds, sf);
                }
                e.Handled = true;
            }
        }

Ответ 9

 'Datagridview'.rowheadervisible=false 

Чтобы скрыть черный ряд строк стрелок ma bob

Datagridview - это имя вашего datagrid без кавычек '' так.... Если ваша сетка называется Example, то

 Example.rowheadervisible=false