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;

и восстановить его.

тогда вы можете изменить свойство унаследованного управления.

Другие вопросы по тегам