Ответ 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;
}
}
}