Intenté crear una clase derivada de WinForm, pero tengo un problema: cuando intento crear mi DerivedClass (a través de Agregar > Nuevo elemento > Formulario derivado), Visual Studio me dice que el objeto no existe.
Estoy seguro de que el objeto en juego es BaseForm porque aparece el mensaje de Setting Error de configuración en la consola. (supongo que se debe a que se llama a la función Close() )
public partial class BaseForm : Form { Port port; public BaseForm() { InitializeComponent(); } protected void Form1_Load(object sender, EventArgs e) { port = new Port(); if (port.Port_Setting() != 0) { Console.WriteLine("Setting Error"); Close(); } } }Por ahora, BaseForm está vacío, solo un formulario sin ningún componente agregado.
La única parte utilizada de mi clase Port hasta ahora es esta, simplemente inicializándola para su uso posterior:
class Port { protected SerialPort sp = new SerialPort(); public int Port_Setting() { Console.WriteLine("Setting port"); if (sp.IsOpen) { sp.Close(); } sp.BaudRate = 38400; sp.DataBits = 8; sp.StopBits = System.IO.Ports.StopBits.One; sp.Parity = System.IO.Ports.Parity.None; sp.PortName = "COM3"; bool Error = false; try { sp.Open(); } catch (UnauthorizedAccessException) { Error = true; } catch (ArgumentException) { Error = true; } catch (System.IO.IOException) { Error = true; } if (Error) { return -1; } return 0; } }Generación de la clase derivada a través de la interfaz de Visual Studio (Agregar> Nuevo elemento> Formulario derivado) –
Ajá, ahora las cosas se me están aclarando.
Cuando deriva un formulario en Visual Studio y abre el formulario derivado en el diseñador, se ejecutará parte del código en el formulario base (el padre del que heredó).
No conozco todos los métodos desde la parte superior de mi cabeza, pero creo que el evento de load , por ejemplo, se ejecutará en el formulario base cuando cargue el formulario heredado en el diseñador en el momento del diseño.
Esto no es un defecto de VS, es por diseño. La idea es que cuando crea un control de usuario personalizado, el código del control de usuario también se puede ejecutar en tiempo de diseño. Y heredar una forma de otra es algo parecido para el diseñador.
Lo que puede hacer para resolver esto es verificar en el código del formulario base si está en tiempo de diseño o no.
He hecho esto agregando este método en mi formulario base:
protected bool IsInDesignMode { get { return DesignMode || LicenseManager.UsageMode == LicenseUsageMode.Designtime; } }puedes usarlo así
private void FormBase_Load(object sender, EventArgs e) { if (IsInDesignMode == false) { // write code here that should only run at runtime } }