Отобразить пользовательский контроль в DatagridViewCell

Winforms.NET 3.5 (С#)

У меня есть DataGridView (DGView), и я создал CustomColumn и CustomCell для отображения в DGView. Я создал CustomUserControl, который я хочу отобразить в CustomCell.

Проблема: я не вижу элемент управления пользователя в столбце. Я думаю, мне нужно переопределить метод Paint() в CustomCell. Любые точки, как я могу это сделать?

Примечание. Пример 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);
        }
    }
}

Ответ 1

Сначала попробуйте. Я попытался поместить пользовательский элемент управления в сетку, где мне было нужно. Проблема: прокрутка вида сетки данных требует повторного размещения всех этих пользовательских элементов управления. Результат - Отклонено.

Вторая попытка. Я построил пользовательский элемент управления и нарисовал его в соответствующей ячейке. Результат - работает до сих пор.

Я просто переопределял методы Paint и OnClick 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);
    }
}

Пример отображает CustomControl в CustomCell CustomColumn;). Когда пользователь нажимает на ячейку, CustomCell OnClick обрабатывает щелчок. В идеале, я хотел бы делегировать этот клик на пользовательский элемент управления CustomControl - который должен обрабатывать событие, как если бы он был кликом на себя (пользовательский элемент управления может внутренне содержать несколько элементов управления) - поэтому его маленький комплекс там.

public class CustomColumn : DataGridViewColumn
{
    public CustomColumn() : base(new CustomeCell()) { }

    public override DataGridViewCell CellTemplate
    {
        get { return base.CellTemplate; }
        set
        {
            if (value != null && !value.GetType()
                .IsAssignableFrom(typeof (CustomeCell)))
                throw new InvalidCastException("It should be a custom Cell");
            base.CellTemplate = value;
        }
    }
}

Ответ 2

Элемент управления DataGridView поддерживает отображение фактического элемента управления, когда ячейка находится в режиме редактирования. Элемент управления DataGridView не предназначен для отображения нескольких элементов управления или повторения набора элементов управления в строке. Элемент управления DataGridView рисует представление элемента управления, когда ячейка не редактируется. Это представление может быть детализировано по вашему желанию. Например, DataGridViewButtonCell рисует кнопку независимо от того, какая ячейка находится в процессе редактирования или нет.

Однако вы можете добавлять элементы управления через метод DataGridView.Controls.Add() и устанавливать их местоположение и размер, чтобы сделать их размещенными в ячейках, but showing controls in all cells regardless of editing make no sense.

Прочитайте здесь

[Обновление - из MS DataGridView Team Prog Mgr]

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