Зачеркнуть весь ряд в Datagridview - PullRequest
4 голосов
/ 26 июля 2011

Я пытаюсь вычеркнуть весь ряд в Datagridview. Вот чем я сейчас занимаюсь:

 DataGridViewCellStyle style = new DataGridViewCellStyle();
 style.Font = new Font(dgview.Font.OriginalFontName, 7, FontStyle.Strikeout);              
 dgview.Rows[dgview.RowCount - 1].DefaultCellStyle.ApplyStyle(style);

Этот подход выделяет только часть ячеек, в которых есть какой-либо текст. То, что я хотел бы, это иметь непрерывный зачеркнутый, то есть одну линию, проходящую через ряд.

Буду признателен за любую помощь в этом. Заранее спасибо.

РЕДАКТИРОВАТЬ: увидел это как вероятный ответ в другом вопросе: «Вероятно, самый простой способ сделать это, если все строки имеют одинаковую высоту, это применить к нему фоновое изображение, которое просто имеет большую линию через центр, тот же цвет, что и у теста. "

Если все остальное не поможет, я бы пошел с этим. Но разве нет ничего проще?

EDIT2: Реализовано предложение Марка с небольшой настройкой. Свойство cellbound не работает для меня должным образом, поэтому я решил получить местоположение, используя rowindex и rowheight.

  private void dgv_CellPainting(object sender,DataGridViewCellPaintingEventArgs e)
    {
        if (e.RowIndex != -1)
        {
            if (dgv.Rows[e.RowIndex].Cells["Strikeout"].Value.ToString() == "Y")
            {
                e.Paint(e.CellBounds, e.PaintParts);
                e.Graphics.DrawLine(new Pen(Color.Red, 2), new Point(e.CellBounds.Left, gridHeaderHeight+ e.RowIndex * rowHeight+ rowHeight/2), 
                    new Point(e.CellBounds.Right, gridHeaderHeight+ e.RowIndex * rowHeight+ rowHeight/2));
                e.Handled = true;
            }
        }
    }

Ответы [ 2 ]

5 голосов
/ 17 декабря 2011

Попробуйте это:

foreach(DataGridViewRow row in dgv.Rows)
                if(!string.IsNullOrEmpty(row.Cells["RemovedBy"].Value.ToString()))
                    row.DefaultCellStyle.Font = new Font(this.Font, FontStyle.Strikeout);
5 голосов
/ 26 июля 2011

Если вы создаете обработчик событий для datagridview_CellPainting, то DataGridViewCellPaintingEventArgs e имеет все, что вам нужно.

Например, вы можете найти строку / столбец ячейки, которая в данный момент окрашивается (e.RowIndex, e.ColumnIndex).

Таким образом, вы можете использовать это, чтобы определить, является ли текущая ячейка той, которую вы хотите изменить.Если это так, вы можете попробовать следующее:

e.Paint(e.CellBounds, e.PaintParts);  // This will paint the cell for you
e.Graphics.DrawLine(new Pen(Color.Blue, 5), new Point(e.CellBounds.Left, e.CellBounds.Top), new Point(e.CellBounds.Right, e.CellBounds.Bottom));
e.Handled = true;

Это нарисует толстую синюю диагональную линию, но вы поняли ... e.CellBounds также имеет высоту / ширину, так что вы можете легко вычислитьсередина, чтобы нарисовать линию.

Вы также можете изменить такие вещи, как e.CellStyle.BackColor, если вы хотите больше, чем просто линия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...