Как остановить текст, созданный CheckBoxRenderer.DrawCheckBox от наслоения - PullRequest
0 голосов
/ 04 декабря 2010

У меня есть следующая ячейка, которая используется для моего пользовательского типа данных столбца в моей сетке данных.

public class DataGridViewReviewerCell : DataGridViewCell
{
    protected override object GetFormattedValue(object value, int rowIndex, ref DataGridViewCellStyle cellStyle,
                                                TypeConverter valueTypeConverter,
                                                TypeConverter formattedValueTypeConverter,
                                                DataGridViewDataErrorContexts context)
    {
        return Value;
    }

    protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex,
                                  DataGridViewElementStates cellState, object value, object formattedValue,
                                  string errorText, DataGridViewCellStyle cellStyle,
                                  DataGridViewAdvancedBorderStyle advancedBorderStyle,
                                  DataGridViewPaintParts paintParts)
    {
        base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, "", "", errorText,
                 cellStyle, advancedBorderStyle, paintParts);
        var parent = (DataGridViewReviewerColumn) OwningColumn;
        var columnValue = (ReviewerCheckBox) Value;

        CheckBoxRenderer.DrawCheckBox(
            graphics,
            new Point(cellBounds.X + 4, cellBounds.Y + 4),
            new Rectangle(cellBounds.X + 2, cellBounds.Y + 4, cellBounds.Width, cellBounds.Height - (4 * 2)),
            "     " + columnValue.ReviewerEmployeeName,
            parent.InheritedStyle.Font, 
            TextFormatFlags.Left,
            false,
            (columnValue.IsChecked ? CheckBoxState.CheckedNormal : CheckBoxState.UncheckedNormal));

    }
}

Этот класс работает, как и ожидалось, однако каждый раз, когда Paint () вызывается как текст (в настоящее время " " + columnValue.ReviewerEmployeeName), он становится слоистым, создавая очень нечитаемый текст. Кажется, я не могу найти ничего, что решило бы эту проблему.

Медленный код

Вот фрагмент кода, который работает очень медленно. Когда я переключаю это в режим отладки, кажется, что он работает бесконечно.

using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;
using System;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            dataGridView1.Rows.Add("STEP A", new ReviewerCheckBox());
            dataGridView1.Rows.Add("STEP B", new ReviewerCheckBox());
        }

        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex == -1 || e.ColumnIndex != 1) return;

            var cell = (ReviewerCheckBox) dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
            cell.IsChecked = !cell.IsChecked;
            cell.ReviewerEmployeeName = (cell.IsChecked ? Environment.UserName : String.Empty);

            //MessageBox.Show("Testing");
        }
    }

    public class ReviewerCheckBox
    {
        public string ReviewerEmployeeName { get; set; }
        public bool IsChecked { get; set; }
        public bool IsRequired { get; set; }
    }
}

    public class DataGridViewReviewerColumn : DataGridViewColumn
    {
        public DataGridViewReviewerColumn()
        {
            CellTemplate = new DataGridViewReviewerCell();
            ReadOnly = false;
            SortMode = DataGridViewColumnSortMode.NotSortable;
            Resizable = DataGridViewTriState.False;
        }
    }

1 Ответ

2 голосов
/ 04 декабря 2010

Вы должны проверить аргумент paintParts, чтобы определить, какие части вы должны рисовать.Например, если фон нуждается в рисовании, будет установлен флаг DataGridViewPaintParts.Backgound.

if (paintParts.HasFlag(DataGridViewPaintParts.Background))
{
  using (SolidBrush cellBackground =
    new SolidBrush(cellStyle.BackColor))
  {
    graphics.FillRectangle(cellBackground, cellBounds);
  }    
}

if (paintParts.HasFlag(DataGridViewPaintParts.Border))
{
  PaintBorder(graphics, clipBounds, cellBounds, cellStyle,
    advancedBorderStyle);
}

// Paint you cell content here

Вот немного более полный пример

using System;
using System.Windows.Forms;
using System.Drawing;
using System.Windows.Forms.VisualStyles;

namespace HideMainWinForm
{
  class DataGridViewReviewerCell : DataGridViewCell
  {
    protected override object GetFormattedValue(object value, int rowIndex, ref DataGridViewCellStyle cellStyle, System.ComponentModel.TypeConverter valueTypeConverter, System.ComponentModel.TypeConverter formattedValueTypeConverter, DataGridViewDataErrorContexts context)
    {
      return value;
    }

    protected override void Paint(System.Drawing.Graphics graphics, System.Drawing.Rectangle clipBounds, System.Drawing.Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
    {
      if (paintParts.HasFlag(DataGridViewPaintParts.Background))
      {
        using (SolidBrush cellBackground =
          new SolidBrush(cellStyle.BackColor))
        {
          graphics.FillRectangle(cellBackground, cellBounds);
        }
      }

      if (paintParts.HasFlag(DataGridViewPaintParts.Border))
      {
        PaintBorder(graphics, clipBounds, cellBounds, cellStyle,
          advancedBorderStyle);
      }

      if (value != null)
      {
        CheckBoxRenderer.DrawCheckBox(
          graphics,
          new Point(cellBounds.X + 4, cellBounds.Y + 4),
          new Rectangle(cellBounds.X+24,cellBounds.Y+4, cellBounds.Width-24, cellBounds.Height-4),
          formattedValue.ToString(),
          OwningColumn.InheritedStyle.Font,
          TextFormatFlags.Left,
          false,
          CheckBoxState.CheckedNormal);
      }
    }
  }
}

Два вызова функции HasFlag могутперевести на

if ((paintParts & DataGridViewPaintParts.Background) == 
    DataGridViewPaintParts.Background)
{
  ...
}

if ((paintParts & DataGridViewPaintParts.Border) == 
    DataGridViewPaintParts.Border)
{
  ...
}
...