【问题标题】:How to add a Label to a DataGridView cell如何将标签添加到 DataGridView 单元格
【发布时间】:2012-12-23 21:19:05
【问题描述】:

有什么方法可以在运行时向 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;
}

谁能解释我现在如何将label“附加”到cell

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

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

【问题讨论】:

  • 您是否尝试过自定义单元格绘制?您应该能够完成任何类型的自定义绘图,包括角落里的小标签。 See this.
  • 谢谢,这听起来可能很理想,但仍不确定如何实际添加标签。我用一个例子更新了我的问题

标签: c# winforms datagridview


【解决方案1】:

如果您正在做自定义绘画,您应该使用Graphics.DrawString 而不是Label 控件。你的eDataGridViewCellPaintingEventArgs 类型,所以它有Graphics 属性。这是一个使用PaintEventArgs的例子,你的应该也差不多。

【讨论】:

  • 非常感谢您的帮助,我使用了 DrawString 方法,并用解决方案更新了我的问题
【解决方案2】:

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

只要按照标签的程序进行

【讨论】:

  • 感谢您的建议,但这似乎只涵盖了如何覆盖编辑控件,但我需要始终显示标签。我已经用更多细节更新了我的问题。
【解决方案3】:

也许这可以解决你的问题

 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
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多