Tengo problemas con las propiedades de una forma base que no mantiene el estado en una forma heredada.Las propiedades personalizadas definidas en forma base pierden su estado en forma heredada al reconstruir
Medio Ambiente:
- Visual Studio 2010 Ultimate Service Pack 1: Versión 10.0.40219.1 SP1Rel
- .Net Framework: Versión 4.0.30319 SP1Rel
- Windows 7 Ultimate
A continuación, se muestra el código fuente y los pasos para reproducir:
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace Test
{
public partial class BaseForm : Form
{
[DefaultValueAttribute(true)]
public bool ControlVisible
{
get
{
return this.checkBox1.Visible;
}
set
{
this.checkBox1.Visible = value;
}
}
[DefaultValueAttribute(false)]
public bool ControlChecked
{
get
{
return this.checkBox1.Checked;
}
set
{
this.checkBox1.Checked = value;
}
}
public BaseForm()
{
InitializeComponent();
}
}
}
En lo anterior, las propiedades predeterminadas coinciden con [DefaultValueAttribute], es decir, en InitializeComponent() checkBox1.Visible se establece en true y checkBox1.Checked es falso. Estas son las configuraciones predeterminadas para el control cuando se colocan en el formulario.
entonces creado la siguiente forma hereditaria:
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace Test
{
public partial class Form1 : BaseForm
{
public Form1()
{
InitializeComponent();
}
}
}
Emisión y pasos para reproducir:
Al abrir Form1 en el diseñador de las propiedades son los en estado siguiente.
Estado: ControlChecked = False - ControlVisible = verdadera (negrita)
ControlVisible se establece en Verdadero como era de esperar, sin embargo, está en negrita. El [DefaultValueAttribute] se establece en true en el formulario base, por lo que esperaba que esta propiedad no estuviera en negrita.
ahora cambio ControlVisible a Falso en el diseñador. El negrita se apaga.
Estado: ControlChecked = False - ControlVisible = False
ahora reconstruir el proyecto y el código en Form1 Obtiene regenerado. La propiedad ControlVisible revierte a True en negrita.
Estado: ControlChecked = False - ControlVisible = verdadera (negrita)
ahora cambio ControlChecked de Falso a Verdadero y se convierte en negrita como se esperaba.
Estado: ControlChecked = verdadera (negrita) - ControlVisible = verdadera (negrita)
reconstruyo el proyecto y ningún cambio.
Estado: ControlChecked = verdadera (negrita) - ControlVisible = verdadera (negrita)
ahora puedo cambiar la propiedad de ControlVisible de verdadera a Falso y reconstruir de nuevo el proyecto . ControlVisible volvió a verdadero en negrita.
Estado: ControlChecked = verdadera (negrita) - ControlVisible = verdadera (negrita)
ControlChecked parece que está funcionando como se esperaba. ControlVisible mantiene volviendo a verdadero cuando se establece en falso y el negrita se invierte. Me parece que de alguna manera no se reconoce [DefaultAttributeValue] de true en el formulario base.
Actualización: Revisado para corregir un error y más exactamente para aislar el problema.
Actualización: Si fijo checkBox1.Visible = false en el constructor de BaseForm, entonces todo funciona como se esperaba. Por lo tanto, parece que el problema es que se reconozca DefaultValueAttribute de verdadero en la propiedad personalizada en el formulario heredado.
checkBox1 es privado en la clase base. Form1.designer.cs establece explícitamente ControlVisible cuando se establece en "verdadero", que se invierte. Esta es la propiedad predeterminada y no la configura cuando es "falsa". Probé ShouldSerialize y Reset y esto no hizo diferencia. El formulario heredado tiene el valor predeterminado invertido en la propiedad personalizada ControlVisible. De alguna manera, no reconoce la configuración DefaultAttribute en la clase base y también parece ignorar el ShouldSerialize/Reset. – Elan
Extraño, hice una demostración local y funciona como usted describió. Cuando un campo de bool privado es la fuente de ControlVisible, funciona como se esperaba, pero cuando la fuente es checkBox1.Visible, no funciona. –
Cuando configuro ControlVisible = false y cambio [DefaultAttribute (false)] en la propiedad. Entonces la forma heredada también funciona como se esperaba. Parece que se reduce a [DefaultAttribute (true)] sin tomar. – Elan