DataGridView заблокирован на унаследованном UserControl - PullRequest
10 голосов
/ 16 октября 2008

У меня есть UserControl с некоторыми предопределенными элементами управления (groupbox, button, datagridview), эти элементы управления помечены как защищенные, а переменная компонентов также помечена как защищенная.

Затем я хочу наследовать от этого базового UserControl другому UserControl, однако DataGridView всегда заблокирован в конструкторе.

Я подозреваю, что это может иметь какое-то отношение к DataGridView, реализующему ISupportInitilize.

public class BaseGridDetail : UserControl

Определен элемент управления DataGridView (и другие).


public class InheritedDetail : BaseGridDetail

Элемент управления DataGridView заблокирован


У кого-нибудь есть идеи, как сделать этот элемент управления доступным в конструкторе после наследования?

Ответы [ 5 ]

11 голосов
/ 16 октября 2008

Похоже, DataListView (и некоторые другие элементы управления) не поддерживают визуальное наследование. Есть проблема с подключением , зарегистрированная здесь , которая не выглядит обнадеживающей.

Были аналогичные проблемы, зарегистрированные с другими элементами управления формы, например FlowLayoutPanel .

Я не могу найти способ навязать визуальное наследование.

Вот официальный ответ на connect : «Для этого конкретного выпуска DataGridView не был предназначен для использования в визуальном наследовании. Мы будем помнить ваше предложение при планировании нашего будущего выпуска» Это от 26.05.2006.

Обновление: найдено это сообщение в блоге, в котором может быть ответ

Редактировать. Мне не удалось проверить утверждения в блоге. Похоже, может быть последней в этом вопросе

Похоже, что вы все еще можете манипулировать DataListView во время выполнения, поэтому вы можете установить визуальные свойства (и другие параметры). Это не очень хороший компромисс.

7 голосов
/ 06 сентября 2010

[1] создайте свой пользовательский элемент управления

[2] заставьте свой пользовательский элемент управления UserControl использовать нижеприведенное наследование DataGridView:

[Designer(typeof System.Windows.Forms.Design.ControlDesigner))]
public class InheritedDataGridView : DataGridView { }

[3] Наследовать от вашего CustomControl, и альт !!

[4] Ох, не забудьте добавить "System.Design" dll

Наслаждайтесь.

3 голосов
/ 16 сентября 2011

Добавьте сетку данных в элемент управления панели и установите модификаторы панели и сетки данных в защищенное состояние. Все ваши унаследованные формы времени доступа будут иметь доступ к свойствам сетки.

1 голос
/ 16 октября 2008

Я оставил ответ, но перечитал ваш вопрос и решил удалить его.

Что в 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
}
0 голосов
/ 12 июля 2016

Изменить свойство на определенное [личное] на [защищенное], определенное в xx.designer.cs который изначально сгенерирован машинным кодом.

например

    private System.Windows.Forms.Button btnSave;

до

    protected System.Windows.Forms.Button btnSave;

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...