4

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

编辑我现在正尝试按照 Neolisk 的建议使用细胞绘画来做到这一点,但我不确定如何实际显示要显示的标签。我有以下代码,现在我将标签文本添加为​​单元格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 子类化并覆盖那里的事件以使用 DrawString 而不是按照 Neolisk 的建议Paint添加 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"; 
4

3 回答 3

1

如果您正在做自定义绘画,您应该使用Graphics.DrawString而不是Label控制。你e是 type DataGridViewCellPaintingEventArgs,所以它Graphics有财产。这是使用PaintEventArgs的示例,您的应该类似。

于 2012-12-26T17:51:59.590 回答
1

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

只需按照标签的程序

于 2012-12-24T12:58:27.020 回答
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
        }
于 2012-12-24T13:28:26.687 回答