在DatagridViewCell中显示用户控件

时间:2012-06-06 19:07:55

标签: c# winforms

Winforms .NET 3.5(C#)

我有一个DataGridView(DGView),我创建了CustomColumn和CustomCell以显示在DGView中。我创建了一个CustomUserControl,我想在CustomCell中显示它。

问题:我没有在列中看到用户控件。我想我需要在CustomCell中覆盖Paint()方法 - 任何一点我该怎么做?

注意 - 托管用户控件的MSDN示例用于编辑单元格值 - 您可以在其中使用户控件在您编辑单元格的位置可见。我希望我的用户控件呈现为正常的winform控件。此用户控件显示行的通知..每行可以有不同的通知。我希望用户能够点击通知并获得有关它的更多详细信息。 ..但是现在我被困在“我如何显示这个用户控件”

任何指针都将受到高度赞赏。

 public class CustomColumn : DataGridViewColumn {
    public CustomColumn() : base(new CustomeCell()) { }
    public override DataGridViewCell CellTemplate
    {
        get
        {
            return base.CellTemplate;
        }
        set
        {
            // Ensure that the cell used for the template is a CalendarCell.
            if (value != null &&
                !value.GetType().IsAssignableFrom(typeof(CustomeCell)))
            {
                throw new InvalidCastException("It should be a custom Cell");
            }
            base.CellTemplate = value;
        }
    }
}
public class CustomeCell : DataGridViewTextBoxCell
{
    public CustomeCell() : base() { }
    public override Type ValueType
    {
        get
        {
            return typeof(CustomUserControl);
        }
    }
    public override Type FormattedValueType
    {
        get
        {
            return typeof(CustomUserControl);
        }
    }
}

2 个答案:

答案 0 :(得分:5)

首先尝试:我尝试将用户控件放在我需要的网格上。问题:滚动数据网格视图需要重新安排所有这些用户控件。 结果 - 拒绝。

第二次尝试:我构建了一个用户控件并将其绘制在适当的单元格中。 结果 - 到目前为止工作。

我刚刚在Paint课程中覆盖OnClick的{​​{1}}和DataGridViewCell方法。

CustomCell

该示例在public class CustomeCell : DataGridViewCell { public override Type ValueType { get { return typeof(CustomUserControl); } } 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) { var ctrl = (CustomUserControl) value; var img = new Bitmap(cellBounds.Width, cellBounds.Height); ctrl.DrawToBitmap(img, new Rectangle(0, 0, ctrl.Width, ctrl.Height)); graphics.DrawImage(img, cellBounds.Location); } protected override void OnClick(DataGridViewCellEventArgs e) { List<InfoObject> objs = DataGridView.DataSource as List<InfoObject>; if (objs == null) return; if (e.RowIndex < 0 || e.RowIndex >= objs.Count) return; CustomUserControl ctrl = objs[e.RowIndex].Ctrl; // Take any action - I will just change the color for now. ctrl.BackColor = Color.Red; ctrl.Refresh(); DataGridView.InvalidateCell(e.ColumnIndex, e.RowIndex); } } 的{​​{1}}中呈现CustomControl;)。当用户点击该单元格时,CustomCell的{​​{1}}会处理该点击。理想情况下,我想将该单击委托给自定义用户控件CustomColumn - 它应该处理事件,就好像它本身就是一个点击(自定义用户控件可以在内部托管多个控件) - 所以它在那里很复杂。

CustomCell

答案 1 :(得分:1)

DataGridView控件仅支持在单元格处于编辑模式时显示实际控件。 DataGridView控件不是为了显示多个控件或每行重复一组控件而设计的。当不编辑单元格时,DataGridView控件将绘制控件的表示。此表示可以根据需要进行详细说明。例如,无论正在编辑的单元格如何,DataGridViewButtonCell都会绘制一个按钮。

但是,您可以通过DataGridView.Controls.Add()方法添加控件,并设置它们的位置和大小以使它们托管在单元格中but showing controls in all cells regardless of editing make no sense.

阅读here

[更新 - 来自MS DataGridView团队的计划经理]

http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/394e04a8-d918-4fdd-be03-dfa13f6a1e66?persist=True