如何将标签添加到DataGridView单元格

时间:2012-12-23 21:19:06

标签: c# winforms datagridview

有没有办法在运行时向DataGridView单元格插入一个标签 - 例如我想在每个单元格的顶角有一个红色的小数字?我是否需要创建一个新的DataGridViewColumn类型,或者我可以在填充DataGridView时添加一个Label吗?

编辑我现在正尝试根据Neolisk的建议使用Cell绘画,但我不确定如何实际显示标签。我有以下代码,现在我在设置Tag之前将标签文本添加为​​单元格Value

private void dgvMonthView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    DataGridView dgv = this.dgvMonthView;
    DataGridViewCell cell = dgv[e.ColumnIndex, e.RowIndex];

    Label label = new Label();
    label.Text = cell.Tag.ToString();
    label.Font = new Font("Arial", 5);
    label.ForeColor = System.Drawing.Color.Red;
}

任何人都可以解释我现在能够如何"附加" labelcell

编辑2 - 解决方案我无法完全按照上述方式工作,因此最终继承了DataGridViewColumn和Cell的子类并覆盖了Paint事件以添加根据neolisk的建议,使用DrawString而不是Label存储在Tag中的任何文本:

class DataGridViewLabelCell : DataGridViewTextBoxCell
{
    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)
    {
        // Call the base class method to paint the default cell appearance.
        base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState,
            value, formattedValue, errorText, cellStyle,
            advancedBorderStyle, paintParts);

        if (base.Tag != null)
        {
            string tag = base.Tag.ToString();
            Point point = new Point(base.ContentBounds.Location.X, base.ContentBounds.Location.Y);
            graphics.DrawString(tag, new Font("Arial", 7.0F), new SolidBrush(Color.Red), cellBounds.X + cellBounds.Width - 15, cellBounds.Y);
        }
    }
}

public class DataGridViewLabelCellColumn : DataGridViewColumn
{
    public DataGridViewLabelCellColumn()
    {
        this.CellTemplate = new DataGridViewLabelCell();
    }
}

实施为:

DataGridViewLabelCellColumn col = new DataGridViewLabelCellColumn();
dgv.Columns.Add(col);
col.HeaderText = "Header";
col.Name = "Name"; 

3 个答案:

答案 0 :(得分:1)

Here是关于如何在Winforms DataGridViewCell中托管控件的MSDN教程。

只需遵循标签

的程序即可

答案 1 :(得分:1)

也许这可以解决你的问题

 class LabelColumn : DataGridViewColumn
{
    public LabelColumn()
        : base(new LabelCell())
    {
    }
    public override DataGridViewCell CellTemplate
    {
        get
        {
            return base.CellTemplate;
        }
        set
        {
            if (value != null &&
            !value.GetType().IsAssignableFrom(typeof(LabelCell)))
            {
                throw new InvalidCastException("Must be a CalendarCell");
            }
            base.CellTemplate = value;
        }
    }
}
public class LabelCell : DataGridViewTextBoxCell
{
    public LabelCell()
        : base()
    {
    }
    public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
    {
        base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
        LabelEditingControl lb = DataGridView.EditingControl as LabelEditingControl;
        if (this.Value == null)
        {
            lb.Value = this.DefaultNewRowValue;
        }
        else
        {
            lb.Value = this.Value;
        }
    }
    public override Type EditType
    {
        get
        {
            // Return the type of the editing control that CalendarCell uses.
            return typeof(LabelEditingControl);
        }
    }

    public override Type ValueType
    {
        get
        {
            // Return the type of the value that CalendarCell contains.

            return typeof(string);
        }
    }
    public override object DefaultNewRowValue
    {
        get
        {
            // Use the "".
            return "";
        }
    }
    class LabelEditingControl : Label, IDataGridViewEditingControl
    {
        DataGridView dataGridView;
        private bool valueChanged = false;
        int rowIndex;
        public Object Value { get; set; }
        public LabelEditingControl()
        {
            this.Enabled = false;
        }
        public object EditingControlFormattedValue
        {
            get
            {
                return this.Value.ToString();
            }
            set
            {
                if (value is String)
                {
                    try
                    {
                        // This will throw an exception of the string is 
                        // null, empty, or not in the format of a date.
                        this.Value = value;
                    }
                    catch
                    {
                        // In the case of an exception, just use the 
                        // default value so we're not left with a null
                        // value.
                        this.Value = "";
                    }
                }
            }
        }
        public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
        {
            return EditingControlFormattedValue;
        }
        public void ApplyCellStyleToEditingControl(
    DataGridViewCellStyle dataGridViewCellStyle)
        {
            this.Font = dataGridViewCellStyle.Font;
            this.ForeColor = dataGridViewCellStyle.ForeColor;
            this.BackColor = dataGridViewCellStyle.BackColor;
        }
        public int EditingControlRowIndex
        {
            get
            {
                return rowIndex;
            }
            set
            {
                rowIndex = value;
            }
        }
        public bool EditingControlWantsInputKey(
   Keys key, bool dataGridViewWantsInputKey)
        {
            // Let the DateTimePicker handle the keys listed.
            switch (key & Keys.KeyCode)
            {
                case Keys.Left:
                case Keys.Up:
                case Keys.Down:
                case Keys.Right:
                case Keys.Home:
                case Keys.End:
                case Keys.PageDown:
                case Keys.PageUp:
                    return true;
                default:
                    return !dataGridViewWantsInputKey;
            }
        }

        // Implements the IDataGridViewEditingControl.PrepareEditingControlForEdit 
        // method.
        public void PrepareEditingControlForEdit(bool selectAll)
        {
            // No preparation needs to be done.
        }
        public bool RepositionEditingControlOnValueChange
        {
            get
            {
                return false;
            }
        }

        // Implements the IDataGridViewEditingControl
        // .EditingControlDataGridView property.
        public DataGridView EditingControlDataGridView
        {
            get
            {
                return dataGridView;
            }
            set
            {
                dataGridView = value;
            }
        }

        // Implements the IDataGridViewEditingControl
        // .EditingControlValueChanged property.
        public bool EditingControlValueChanged
        {
            get
            {
                return valueChanged;
            }
            set
            {
                valueChanged = value;
            }
        }

        // Implements the IDataGridViewEditingControl
        // .EditingPanelCursor property.
        public Cursor EditingPanelCursor
        {
            get
            {
                return base.Cursor;
            }
        }

    }
}

在表单上写下此代码

 LabelColumn clm = new LabelColumn();
        dataGridView1.Columns.Add(clm);
        dataGridView1.Rows.Add(5);
        foreach (DataGridViewRow row in this.dataGridView1.Rows)
        {
            row.Cells[0].Value ="hello"; //or do anything desired
        }

答案 2 :(得分:1)

如果您正在进行自定义绘画,则应使用Graphics.DrawString代替Label控件。您的e类型为DataGridViewCellPaintingEventArgs,因此它具有Graphics属性。以下是使用PaintEventArgs的示例,您的应该是类似的。