Pergunta

Eu tenho um UserControl com alguns controles predefinidos (groupbox, botão, datagridview) sobre ele, esses controles são marcados como protegidos e a variável de componentes também é marcado como protegido.

Eu, então, quer herdar desta UserControl base para outra UserControl, no entanto, o DataGridView está sempre trancada no designer.

Eu suspeito que pode ter algo a ver com o DataGridView implementação ISupportInitilize.

public class BaseGridDetail : UserControl

tem um controle DataGridView (et al) definido.


public class InheritedDetail : BaseGridDetail

O controle DataGridView está bloqueado


Alguém tem alguma idéia de como fazer esse controle disponível no designer após inheritenace?

Foi útil?

Solução

Ao que parece, DataListView (e alguns outros controles) não suportam herança visual. Há um problema de conexão logged aqui que não parece esperançoso.

Houve problemas semelhantes registrados com outros controles de formulário, por exemplo, FlowLayoutPanel .

Eu sou incapaz de encontrar uma maneira de forçar a herança visual.

Aqui está a resposta oficial sobre Ligação: "Para esta versão particular, a DataGridView não foi projetado para ser usado em intheritance visual. Iremos manter a sua sugestão em mente quando planejamos nosso futuro lançamento" Isso é de 26/05/2006.

Update: encontrada este post que pode ter a resposta

Edit: eu era incapaz de verificar as alegações do post. Looks como pode ser a mais recente sobre esta questão

Parece que você ainda pode manipular o DataListView em tempo de execução, porém, assim que você pode ser capaz de definir propriedades visuais (e outras configurações). Não é um grande compromisso.

Outras dicas

[1] criar o seu UserControl personalizado

[2] fazer o seu costume UserControl usar o abaixo Herdado DataGridView:

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

[3] Herdar do seu UserControl personalizada, e viola !!

[4] Ohh não se esqueça de adicionar "System.Design" dll

Aproveite.

Adicionar a grade de dados para um painel de controlo e definir os modificadores do painel e a grade de dados para protegido. Isso tudo vai o seu acesso formulário tempo de design herdado para as propriedades da grade.

Eu deixei uma resposta, mas re-ler a pergunta e decidiu excluí-lo.

O que é sobre o DataGridView que você está tentando modificar no controle herdado? É colunas? Eu tenho sido capaz de fazer isso através da criação de um método protegido no meu UserControl base e passando coleção coluna da grade para ele, como este:

// in base UserControl
public BaseGridDetail()
{
    InitializeComponent();

    InitGridColumns(dataGridView1.Columns);
}

protected virtual void InitGridColumns(DataGridViewColumnCollection columns)
{
    columns.Clear();
}

Agora, o seu controle derivado pode simplesmente substituir esse método, assim:

// in InheritedDetail
protected override void InitGridColumns(DataGridViewColumnCollection columns)
{
    base.InitGridColumns(columns);
    // add my own custom columns
}

Alterar propriedade para definido [privada] para [protegidas] definido pelo xx.designer.cs que é originalmente máquina de código gerado.

Por exemplo

    private System.Windows.Forms.Button btnSave;

para

    protected System.Windows.Forms.Button btnSave;

e reconstruí-lo.

então você pode alterar a propriedade de controle herdado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top