Решил немного расширить функциональность стандартного DataGridView и добавить туда отображение изображений в заголовке колонок. Естественно захотелось чтобы эти колонки можно было в процессе разработки визуально привязать к картинкам.
Простейший вариант переопределенной колонки выглядит так:
public class ucDataGridViewCheckBoxColumn : DataGridViewCheckBoxColumn, IDataGridViewBaseColumnWithImage
{
private int _imageIndex;
public ucDataGridViewCheckBoxColumn() : base()
{
ImageIndex = -1;
}
public int ImageIndex { get { return _imageIndex; } set { _imageIndex = value; } }
}
Определяем любую колонку datagridview как ucDataGridViewCheckBoxColumn, идем в ее свойства и видим, что ImageIndex == -1. Ок, меняем на наше значение. Нажимаем Ок. И что мы видим в следующий раз когда заходим в настройки? Верно! -1. Вопрос, где мой косяк?
... << RSDN@Home 1.2.0 alpha 4 rev. 1138>>
DesignerSerializationVisibilityAttribute
Posted via RSDN NNTP Server 2.1 beta
Вам нужно переопределить метод Clone(), в котором устанавливать ваши дополнительные свойства. Кстати, даже в примере от microsoft'а где создается кастомный столбец для датагрида, проблема сериализации не решена.
В общем сделайте так:
public override object Clone()
{
ucDataGridViewCheckBoxColumn col = base.Clone() as ucDataGridViewCheckBoxColumn;
col.ImageIndex = ImageIndex;
return col;
}
и все должно быть ок.
Здравствуйте, маген, Вы писали:
М> DesignerSerializationVisibilityAttribute
К сожалению, не работает:
[DesignTimeVisible(false), ToolboxItem(false), Serializable]
public class ucDataGridViewTextBoxColumn : DataGridViewTextBoxColumn
{
private int _imageIndex = -1;
public ucDataGridViewTextBoxColumn()
{
// ImageIndex = -1;
}
[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Content), EditorBrowsable(EditorBrowsableState.Always), DefaultValue(-1), Category("Appearance")]
public int ImageIndex { get { return _imageIndex; } set { _imageIndex = value; } }
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1138>>
MC>Вам нужно переопределить метод Clone(), в котором устанавливать ваши дополнительные свойства. Кстати, даже в примере от microsoft'а где создается кастомный столбец для датагрида, проблема сериализации не решена.
MC>В общем сделайте так:
MC>public override object Clone()
MC>{
MC> ucDataGridViewCheckBoxColumn col = base.Clone() as ucDataGridViewCheckBoxColumn;
MC> col.ImageIndex = ImageIndex;
MC> return col;
MC>}
MC>и все должно быть ок.
А вот как переопределяется Clone() в DataGridViewImageColumn, возможно стоит сделать примерно так же:
public override object Clone()
{
DataGridViewImageColumn dataGridViewColumn;
Type thisType = this.GetType();
if (thisType == columnType) //performance improvement
{
dataGridViewColumn = new DataGridViewImageColumn();
}
else
{
// SECREVIEW : Late-binding does not represent a security thread, see bug#411899 for more info..
//
dataGridViewColumn = (DataGridViewImageColumn)System.Activator.CreateInstance(thisType);
}
if (dataGridViewColumn != null)
{
base.CloneInternal(dataGridViewColumn);
dataGridViewColumn.Icon = this.icon;
dataGridViewColumn.Image = this.image;
}
return dataGridViewColumn;
}