如何添加标签到DataGridView单元格

本文关键字:DataGridView 单元格 加标签 何添 | 更新日期: 2023-09-27 17:49:16

是否有任何方法在运行时插入标签到DataGridView单元格-例如,我想在每个单元格的顶部角落有一个小红色数字?我是否需要创建一个新的DataGridViewColumn类型,或者我可以在那里添加一个标签,当我填充DataGridView?

EDIT我现在正试图按照Neolisk的建议使用Cell绘画来做到这一点,但我不确定如何实际获得要显示的标签。我有以下代码,在设置单元格的Value之前,我现在将标签文本添加为单元格的Tag:

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和单元格和覆盖Paint事件那里添加任何文本存储在Tag使用DrawString而不是标签按照neolisk的建议:

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"; 

如何添加标签到DataGridView单元格

如果你正在做自定义绘画,你应该使用图形。DrawString代替Label控件。您的e类型为DataGridViewCellPaintingEventArgs,因此它具有Graphics属性。下面是一个使用PaintEventArgs的例子,你的应该是类似的

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

按照标签

的步骤

也许这可以解决你的问题

 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
        }