Как добавить флажок и метку в одной ячейке datagridview? - PullRequest
3 голосов
/ 22 марта 2012

Привет, программисты, мне нужно добавить флажок и метку в одну ячейку. Я знаю, как это сделать.Я могу сделать флажок datagridviewcolumn to, но тогда он только показывает флажок и нет места для отображения метки.Кто-нибудь может разбудить меня от этого кошмара?Заранее спасибо.

1 Ответ

5 голосов
/ 23 марта 2012

Я не верю, что это возможно с помощью стандартного CheckBoxCell.

Вот реализация, которая подклассирует столбец флажка и выполняет некоторую настраиваемую рисование для рисования метки. Это можно расширить различными способами, например, предлагая привязку для текста метки (в настоящее время требуется, чтобы текст метки был установлен напрямую). Мой код сильно заимствует из этого сообщения на форуме .

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

public class MyDGVCheckBoxColumn : DataGridViewCheckBoxColumn
{
    private string label;

    public string Label
    {
        get
        {
            return label;
        }
        set
        {
            label = value;
        }
    }

    public override DataGridViewCell CellTemplate
    {
        get
        {
            return new MyDGVCheckBoxCell();
        }
    }
}

public class MyDGVCheckBoxCell : DataGridViewCheckBoxCell
{
    private string label;

    public string Label
    {
        get
        {
            return label;
        }
        set
        {
            label = value;
        }

    }

    protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates elementState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
    {

        // the base Paint implementation paints the check box
        base.Paint(graphics, clipBounds, cellBounds, rowIndex, elementState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);

        // Get the check box bounds: they are the content bounds
        Rectangle contentBounds = this.GetContentBounds(rowIndex);

        // Compute the location where we want to paint the string.
        Point stringLocation = new Point();

        // Compute the Y.
        // NOTE: the current logic does not take into account padding.
        stringLocation.Y = cellBounds.Y + 2;


        // Compute the X.
        // Content bounds are computed relative to the cell bounds
        // - not relative to the DataGridView control.
        stringLocation.X = cellBounds.X + contentBounds.Right + 2;


        // Paint the string.
        if (this.Label == null)
        {
            MyDGVCheckBoxColumn col = (MyDGVCheckBoxColumn)this.OwningColumn;
            this.label = col.Label;
        }

        graphics.DrawString(
        this.Label, Control.DefaultFont, System.Drawing.Brushes.Red, stringLocation);

    }

}

Вот код, показывающий использование:

private void Form1_Load(object sender, EventArgs e)
{
    MyDGVCheckBoxColumn col = new MyDGVCheckBoxColumn();
    col.Label = "hippo";
    col.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
    this.dataGridView1.Columns.Add(col);
    this.dataGridView1.RowCount = 5;

    foreach (DataGridViewRow row in this.dataGridView1.Rows)
    {
        if (row.Index % 2 == 0)
        {
            ((MyDGVCheckBoxCell)row.Cells[0]).Label = "kitten";
        }
    }
}
...