Manejo de valores entre form

Espero que te encuentres bien.
Estoy empezando a programar en C#, y me han surgido varias dudas.
¿Se puede eliminar el botón de cerrar (X) de los winform? ¿Si, cómo? Me podrías poner un ejemplo!
Y mi otra duda es:
Estoy creando un programilla con un menú MDI, al cual le agregue propiedades, la de Alta_Abierta que es privada y la de AltaAbierta la cual es pública y modifica los valores de la primera.
private int Alta_Abierta=0;
public int AltaAbierta
{
get { return Alta_Abierta; }
set { Alta_Abierta = value; }
}
Lo hice para validar desde el menú MDI si ya he abierto el formulario altas. En el menú tengo:
if (this.AltaAbierta==0)
{
this.AltaAbierta = 1;
FrmAltas FormAltas = new FrmAltas();
FormAltas.MdiParent = this;
FormAltas.Show();
}
Lo cual modifico mi variable y funciona como una bandera, pero al momento de programar el cambio de valor en el formaltas cuando lo cierro en el evento frmclosing marca error, lo cual es lógico
this.MdiParent.AltaAbierta=0
Por que aun no existe el form menú, pero existe alguna forma para insertar una clase, y que haga uso el menú y el form de altas y que manipule los mismos valores o si hay algún método para validar si no existe más de un form abierto, (es decir, si ya tengo abierto el form altas y vuelvo a dar click en el botón del menú para abrir altas que no lo haga).
Pero si existe o no, si me gustaría saber la forma de poder modificar los valores de un form a otro form, y poderlo compilar, no se si la clase que se inserte es para la solución o solo para un form.

3 respuestas

Respuesta
1
Que tal ya pues mira para lo primero,
ControlBox te quita todos los botones mazimizar y minimizar
MaximizeBox solo el de maximizar y minimizebox solo el de minimizar
es lo maximo que puedes llegar a validar, si quieres eliminar esos botones en wpf es muy senillo
Y lo segundo pues yo la unica forma que lo manejo es generando una clase de variables globales te pongo el codigo, cada atributo es estatico por lo que no necesita instanciar la clase es como tener en memoria todo lo que quieres, no abuses mucho de los static porque eso relentiza tu aplicatio
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public class UtilGlobal
{
//El formulario que tendra las variables
private static Form1 m_formularioPrincipal;
public static Form1 FormularioPrincipal
{
get { return UtilGlobal.m_formularioPrincipal; }
set { UtilGlobal.m_formularioPrincipal = value; }
}
//Si quiciera tener en memoria el usuario que ingreso al aplicativo, ojo Usuario es un objeto como tal
private static Usuario m_usaurioActivo;
public static Usuario UsaurioActivo
{
get { return UtilGlobal.m_usaurioActivo; }
set { UtilGlobal.m_usaurioActivo = value; }
}
}
}
a lo que inicia el programa, digamos que form1 es el formulario principal de mi aplicativo cierto, como quien dice el que va a tener las variables esa de altta y demas; con eso le toy asignando en las global que ese formulario esta instanciado y activo y tiene variables con cierto valor de la alta bool m_alta = false;
public partial class Form1 : Form
{
private bool m_alta = false;
public bool Alta
{
get { return m_alta; }
set { m_alta = value; }
}
public Form1()
{
InitializeComponent();
UtilGlobal.FormularioPrincipal = this;
entonces en el boton o menu que abre el formulario tendria que poner un codigo como este, donde valido que si es falso o 0 o lo que le quieras poner lo haga y cambie el valor antes de mostrar, con eso solo se mostrara una vez
private void buttonAbrir_Click(object sender, EventArgs e)
{
if (!UtilGlobal.FormularioPrincipal.Alta)
{
Form2 frm = new Form2();
UtilGlobal.FormularioPrincipal.Alta = true;
frm.ShowDialog();
}
}
ahora para regresar la variable a su estado normal, debes hacer la siguiente sentencia al cerrar el formulario que abristes, debes manejar el evento formclosed
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
UtilGlobal.FormularioPrincipal.Alta = false;
}
Hola, muchas gracias por la ayuda, si me sirve lo de variables static, pero como dices no hay que abusar.
Aprovechando, ¿sabes cómo se puede crear una clase de un control? Por ejemplo, quiero una etiqueta con ciertas propiedades modificadas, que son generales para todas las etiquetas del programa que estoy haciendo, pero no he encontrado la forma de hacer de un control sea una clase, de ante mano muchas gracias.
Saludos
sabes no se si te entendi ien pero lo que quieres en cojer y hacr a un control de .net darle una propiedad aumentada por ti, tonces quieres hacer que una clase se comporte como un control, eso es lo que te entiendo
por ejemplo clase textonuevo que se comporte como un textbox
lo que puedes hacer es al momento de estar creando la clase
public class nueva : TextBox
{
}
O crea un nuevo user control que así mismo herede
de : Textbox
con :TextBox haces herencia al objeto que quieras
saludos, disculpa por no darte código de eso pero la verdad nunca lo he necesitado y no lo he hecho pero pruébale de esa forma en teoría debería valer.
Hola, gracias por la ayuda, si, si ocupo controles modificados por mi y que los pueda heredar, y he intentado hacelo:
public class LabelBase : Label

<span style="white-space: pre;"> </span>/// pero al modificar sus propiedades no aparecen.
}
Pero aparte, no se en que tipo de documento tengo que crear, si WPF Aplicación, Class Library, Windows Forms Control Library, o Class o code file o Component class, etc.. no he podido descifrar ni los pasos para realizarlo.
Te agradezco de ante mano.
A ay si andas trabajando en wpf, puedes agregarlo en el propio proyecot con usercontrol, si lo quieres reutilizar en otros proeyctos ponlo como wpfusercontrollibrary o algo así, el wpfclasslibrary son solo para als capas como de operaciones, lógica, etc,
para que puedas acceder a als propiedades deberían ser algo como esto, ojo no esta conpilado así que ah de tener errores lo escribí directo, pero esa es la idea saludos
UcMiLabel : Label
{
private string m_propiedad1;
public strng Propiedad1
{
get
{
return m_propiedad;
}
set
{
m_propiedad1 = vlaue;
}
}
public ucMiLabel()
{
}
}
Hola, gracias por la ayuda.
Si se puede crear la clase, ya lo hice! Agregue una clase a la solución, pero no puedo modificar sus propiedades. Ejemplo.
public class labelbase :  Label
{     
}
Y si puedo agregar propiedades, pero lo que ocupo es modificar las propiedades que tiene, como el font, size, background, etc..
Intente con los WPF custom control library, pero no he encontrado la solución. Si pudieras pasarme un tutorial, paso por paso que diga como crear controles personalizados o los controles de usuario de WPF estaría muy agradecido. He intentado lo que dicen en algunas páginas como :
http://social.msdn.microsoft.com/Forums/es-ES/vcses/thread/68e5b48e-9325-4c9f-8b9f-094a3bfbea4f
http://msdn.microsoft.com/es-es/library/system.windows.controls.usercontrol(VS.95).aspx
http://translate.google.com.mx/translate?hl=es&langpair=en|es&u=http://www.wpftutorial.net/HowToCreateACustomControl.html
http://msdn.microsoft.com/es-es/library/system.windows.controls.usercontrol.aspx
Entre otras, pero no se si es la configuración de mi VS, no se cual es el problema. Solo necesito los pasos correctos para generar uno solo. Gracias
Claro pero no se si podría ser el fin de semana porque esta semana que me ha tocado ha sido horrible :)
Hola, gracias por tu ayuda.
Gracias, esperare tu respuesta. Y espero que tu semana mejore! Saludos
Que tal amigo mira ahí te dejo un link para que lo revises, por cierto disculpa la demora he estado a full
Saludos
http://www.megaupload.com/?d=9I03PW15
Respuesta
1
La respuesta a tu primera pregunta es, hay una propiedad del form que se llama control box, con ese deshabilitas el botón cerrar, minimizar y restaurar.
Lo segundo, digamos que es un poco más complicado.
Bueno la manera más simple es la siguiente:
En el constructor de tu form hijo pasa como parámetro una copia del form MDI, de esta manera, en el evento closing, modificas el valor de la variable privada del form MDI para regresarla a 0, si no te sirve esta solución, tal vez lo que necesites primero en tu código es "parsear" la propiedad MdiParent de tu form hijo a el form padre pero explícitamente es decir:
FormMdi  MiFormMDI = (FormMdi)this.MdiParent;
MiFormMDI.AlataAbierta=0;
Tal vez esto funcionaria.
Comenta que te sirvió, y si no poder ayudarte nuevamente
Hola, muchas gracias por la ayuda, si me sirvió para los botones del control del form, la otra solución no, pero investigando un poco encontré:
<span style="white-space: pre;"> </span>    int encontro = 0;
            string NombreAltaBuscar;
            for (int i = 0; i <= FormMdi.MdiChildren.Length-1; i++)
            {
                NombreAltaBuscar = FormMdi.MdiChildren.Name;
                if ( NombreAltaBuscar == "FrmAltas")
                { 
                    encontro = 1; 
                }//
            }//fin del ciclo for
 int encontro = 0; 
string NombreAltaBuscar;          
 for (int i = 0; i <= FormMdi.MdiChildren.Length-1; i++)  
   {                NombreAltaBuscar = FormMdi.MdiChildren.Name; 
               if ( NombreAltaBuscar == "FrmAlta"   {  encontro = 1;}//  
    }//fin del ciclo for
Con esto encuentro los forms que quiera, de hacerlo como dices me marca error ya que no existe el form altas en tiempo de programación.
Aprovechando, ¿sabes cómo se puede crear una clase de un control? Por ejemplo, quiero una etiqueta con ciertas propiedades modificadas, que son generales para todas las etiquetas del programa que estoy haciendo, pero no he encontrado la forma de hacer de un control sea una clase, de ante mano muchas gracias.
Si lo que quieres es un control modificado, un control de usuario es lo mejor, ademas también aparece en la barra de herramientas, ahora la otra forma es hacerlo mediante una clase y que esta herede de Label, sin embargo creo que esto se te complicaría más.
Hola, gracias por la ayuda, si, si ocupo controles modificados por mi y que los pueda heredar, y he intentado hacelo:
public class LabelBase : Label

/// pero al modificar sus propiedades no aparecen.
}
Pero aparte, no se en que tipo de documento tengo que crear, si WPF Aplicación, Class Library, Windows Forms Control Library, o Class o code file o Component class, etc.. para generar la DLL y así usarlo como control en mis proyectos, he intentado en todos los que mencioné pero no he podido descifrar los pasos para realizarlo.
Te agradezco de ante mano.
Necesitas el Windows Forms Control Library, desde ahí creas tu proyecto y la dll generada por ese proyecto puede ser agregada a la barra de herramientas.
Hola, gracias por la ayuda.
Pero si me podrías enviar un ejemplo, paso por paso, para realizarlo, por favor. Gracias
Disculpa la tardanza, aquí tienes la liga a un ejemplo de como crear los controles personalizados
http://msdn.microsoft.com/es-es/library/cc438236(VS.71).aspx
Respuesta
1
Por lo del botón cerrar: Es posible utilizando algunas rutinitas del API, hay mucha documentación y ejemplos de esto en Internet, si buscas en Google "how to disable form close button c#" verás... pero checa esta página, te va a servir: http://blogs.msdn.com/b/atosah/archive/2007/05/18/disable-close-x-button-in-winforms-using-c.aspx
Ahora, por lo del form hay 2 formas.
1) Lo que intentabas, solo faltaba verificar que MdiParent exista, y hacer un cast, te explico más o menos como, asumiendo que la clase del form MDI se llame "formMdi":
if(this.MdiParent != null)
((formMdi)this.MdiParent).AltaAbierta = 0;
2) Definiendo el flag en una clase estática, por ejemplo, en Program. Cs, lo único que debes hacer es declarar la variable como tipo pública+static, y fácilmente llegar a esta desde cualquier parte del programa, te cito también el ejemplo dentro del evento load y closing de un form:
static class Program
{
public static int AltaAbierta = 0;
...
}
        private void Form1_Load(object sender, EventArgs e)
        {
            Program.AltaAbierta = 1;
        }
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            Program.AltaAbierta = 0;
        }

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas