2008-10-16 29 views
9

Tengo un UserControl con algunos controles predefinidos (groupbox, button, datagridview) en él, estos controles están marcados como protegidos y la variable de componentes también está marcada como protegida.DataGridView bloqueado en un UserControl heredado

Luego deseo heredar de este UserControl base a otro UserControl, sin embargo, DataGridView siempre está bloqueado en el diseñador.

Sospecho que puede tener algo que ver con el DataGridView que implementa ISupportInitilize.

public class BaseGridDetail : UserControl 

Tiene un control DataGridView (et al) definido.


public class InheritedDetail : BaseGridDetail 

El control DataGridView está bloqueado


¿Alguien tiene alguna idea de cómo hacer este control disponible en el diseñador después inheritenace?

Respuesta

10

Por lo visto, DataListView (y algunos otros controles) no son compatibles con la herencia visual. Hay un problema de conexión logged here que no parece prometedor.

Se han producido problemas similares registrados con otros controles de formulario, p. Ej. flowlayoutpanel.

No puedo encontrar una forma de forzar la herencia visual.

Aquí está la respuesta oficial sobre connect: "Para esta versión particular, el DataGridView no fue diseñado para ser utilizado en intheritance visual Vamos a seguir su sugerencia en cuenta cuando planificamos nuestra versión futura." Eso es de 26/05/2006.

Actualización: encontró this blog post which may have the answer

Editar: yo era incapaz de verificar las afirmaciones de la entrada de blog. Parece que might be the latest on this issue

Parece que todavía se puede manipular la DataListView en tiempo de ejecución, sin embargo, por lo que podría ser capaz de establecer las propiedades visuales (y otras configuraciones). No es un gran compromiso.

+0

Todavía está en VS2010: http://stackoverflow.com/questions/15089289/cannot-visually-change-datagridview-in-wedded-form/15090076#15090076 También agregué algunas notas adicionales en los perfiles de .NET. –

1

Dejé una respuesta pero volví a leer su pregunta y decidí eliminarla.

¿Qué tiene DataGridView que está tratando de modificar en el control heredado? ¿Son columnas? He sido capaz de hacer esto mediante la creación de un método protegido en mi control de usuario de base y pasando colección de columnas de la cuadrícula en él, así:

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

    InitGridColumns(dataGridView1.Columns); 
} 

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

Ahora su control derivada simplemente puede anular ese método, así:

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

En el diseñador, todos los controles pueden tener cualquiera de sus propiedades modificadas, excepto DataGridView. Está bloqueado desde la perspectiva del diseñador completamente. – benPearce

+0

Sí, habiendo leído la respuesta de Rob a su pregunta, recordé por qué tenía que ir por la ruta "InitGridColumns" en mi propia aplicación. La herencia visual simplemente no funciona con DataGridView. –

5

[1] crear su control de usuario personalizado

[2] a hacer su encargo Usercontrol utilizar el DataGridView a continuación Hereditaria:

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

[3] La herencia de su control de usuario personalizado, y Viola !!

[4] Ohh No se olvide de añadir "System.Design" DLL

disfrutar.

3

Agregue la cuadrícula de datos a un control de panel y establezca los modificadores del panel y la cuadrícula de datos como protegidos. Esto le dará acceso a las propiedades de la cuadrícula a todo el tiempo de diseño del formulario heredado.

+0

¡Buena sugerencia! Esto al menos nos permite posicionar y cambiar el tamaño del DataGrid en el Formulario hijo. Que a menudo es todo lo que uno necesita. –

+0

¡Gracias buscamos una solución hace 4 años y no tropezamos con esta publicación hasta ahora! – Nullpoint

0

Cambia la propiedad definida [privada] a [protegida] definida en xx.designer.cs que originalmente es un código generado por la máquina.

por ejemplo

private System.Windows.Forms.Button btnSave; 

a

protected System.Windows.Forms.Button btnSave; 

y reconstruirlo.

luego puede cambiar la propiedad del control heredado.