DataGridView заблокирован на унаследованном UserControl
У меня есть UserControl с некоторыми предопределенными элементами управления (groupbox,button,datagridview), эти элементы управления помечены как защищенные, а переменная компонентов также помечена как защищенная.
Затем я хочу наследовать от этого базового UserControl другому UserControl, однако DataGridView всегда заблокирован в конструкторе.
Я подозреваю, что это может иметь какое-то отношение к DataGridView, реализующему ISupportInitilize.
public class BaseGridDetail : UserControl
Определен элемент управления DataGridView (и другие).
public class InheritedDetail : BaseGridDetail
Элемент управления DataGridView заблокирован
У кого-нибудь есть идеи, как сделать этот элемент управления доступным в конструкторе после наследования?
5 ответов
Похоже, DataListView (и некоторые другие элементы управления) не поддерживают визуальное наследование. Здесь есть проблема с подключением, которая не выглядит обнадеживающей.
Были аналогичные проблемы, зарегистрированные с другими элементами управления формой, например, flowlayoutpanel.
Я не могу найти способ навязать визуальное наследование.
Вот официальный ответ о подключении: "Для этого конкретного выпуска DataGridView не был предназначен для использования в визуальном наследовании. Мы будем помнить ваше предложение при планировании нашего будущего выпуска", то есть от 26.05.2006.
Обновление: нашел этот пост в блоге, который может иметь ответ
Изменить: я не смог проверить претензии в блоге. Похоже, может быть последним в этом вопросе
Похоже, что вы все еще можете манипулировать DataListView во время выполнения, поэтому вы можете установить визуальные свойства (и другие параметры). Это не отличный компромисс.
[1] создайте свой пользовательский элемент управления
[2] заставьте свой пользовательский userControl использовать нижеприведенный Inherited DataGridView:
[Designer(typeof System.Windows.Forms.Design.ControlDesigner))]
public class InheritedDataGridView : DataGridView { }
[3] Наследовать от вашего CustomControl, и альт!
[4] Ооо не забудьте добавить "System.Design" dll
Наслаждаться.
Добавьте сетку данных в элемент управления панели и установите модификаторы панели и сетки данных в защищенное состояние. Это позволит всем вашим унаследованным формам времени доступа к свойствам сетки.
Я оставил ответ, но перечитал ваш вопрос и решил удалить его.
Что вы думаете о DataGridView, который вы пытаетесь изменить в унаследованном элементе управления? Это колонны? Я смог сделать это, настроив защищенный метод в своем базовом UserControl и передав в него коллекцию столбцов сетки, например:
// in base UserControl
public BaseGridDetail()
{
InitializeComponent();
InitGridColumns(dataGridView1.Columns);
}
protected virtual void InitGridColumns(DataGridViewColumnCollection columns)
{
columns.Clear();
}
Теперь ваш производный элемент управления может просто переопределить этот метод, например так:
// in InheritedDetail
protected override void InitGridColumns(DataGridViewColumnCollection columns)
{
base.InitGridColumns(columns);
// add my own custom columns
}
Измените свойство на определенное [личное] на [защищенное], определенное в файле xx.designer.cs, который изначально был сгенерированным компьютером кодом.
например
private System.Windows.Forms.Button btnSave;
в
protected System.Windows.Forms.Button btnSave;
и восстановить его.
тогда вы можете изменить свойство унаследованного управления.