Hola a tod@s,
Primero os explico el problema y después os pongo todo el código, que por cierto me tiene super rallado no veo el porque por ningún lado.
Resulta que tengo un Formulario MDI que es el que carga Application.Run desde el Main. En el evento load de este formulario tengo un codigo que abre como ventana modal otra ventana en la que tengo unos controles y códigos para un login de usuario. En esta última ventana asigno los valores Cancel u OK a DialogResult en función de lo que ocurra en la comprobación del usuario. Al asignar DialogResult a OK o Cancel se realiza el cierre del formulario. Recordad que la abrí como Modal (ShowDialog) desde el formulario MDI principal. Este formulario principal continua su código después de recibir la respuesta de la ventana Modal. Si devolvió OK hago un Dispose de la venta modal y muestro el formulario MDI, si devolvió algo distinto a OK (Cancel por ejemplo) hago un Dispose de la ventana Modal y un Close al MDI (y se cierra la aplicación sin problemas). Bien ahora viene lo raro, este formulario MDI tiene un menu salir con este codigo en su evento click this.Close(); Se me cierra la ventana principal pero LA APLICACIÓN SIGUE ACTIVA (si abro el Task Manager del windows sale el exe y si lo ejecuto desde Visual Studio me sigue con las ventanas de depuración hasta que le doy a STOP).
Os pongo los códigos de Program.cs y de los dos formularios:
Program.cs
Código:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace Tripmania
{
static class Program {
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmPrincipal());
}
}
}
frmPrincipal.js
Código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Tripmania {
public partial class frmPrincipal : Form {
public frmPrincipal() {
InitializeComponent();
}
private void salirToolStripMenuItem_Click(object sender, EventArgs e) { this.Close(); }
private void frmPrincipal_Shown(object sender, EventArgs e) {
this.Hide();
frmLogin logWindow = new frmLogin();
if (logWindow.ShowDialog() != DialogResult.OK) {
logWindow.Dispose();
this.Close();
} else {
logWindow.Dispose();
this.Show();
}
}
}
}
frmLogin.cs
Código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;
using MyFunctions;
namespace Tripmania {
public partial class frmLogin : Form {
public frmLogin() {
InitializeComponent();
}
private void btnExit_Click(object sender, EventArgs e) {
if (MessageBox.Show("¿Está seguro que desea salir de la aplicación?", "Salir del Panel", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) this.DialogResult = DialogResult.Cancel;
}
private void btnClean_Click(object sender, EventArgs e) {
txtPass.Text = "";
txtUser.Text = "";
}
private void btnEnter_Click(object sender, EventArgs e) {
lblStatus.Text = "Conectando ...";
this.Enabled = false;
const string title = "Error de Acceso";
if (this.txtUser.Text == "") {
lblStatus.Text = "";
this.Enabled = true;
MessageBox.Show("Introduzca un nombre de usuario.", title, MessageBoxButtons.OK, MessageBoxIcon.Information);
this.txtUser.Focus();
} else if (this.txtPass.Text == "") {
lblStatus.Text = "";
this.Enabled = true;
MessageBox.Show(String.Format("Introduzca la clave del usuario {0}.", this.txtUser.Text.ToUpper()), title, MessageBoxButtons.OK, MessageBoxIcon.Information);
this.txtPass.Focus();
} else {
DataAccess tripmaniaData = new DataAccess("xxxxxx", "xxxxxx", "xxxxxx");
tripmaniaData.setSSHInfo("xxx.xxx.xxx.xxx", "xxxx", "xxxxxx");
string[] where = { "user=" + TextManipulation.safeSQL(this.txtUser.Text), "pass=" + TextManipulation.safeSQL(Crypto.getSHA1(this.txtPass.Text)) };
lblStatus.Text = "Comprobando usuario ...";
if (tripmaniaData.checkRegistry("logins", where)) {
this.DialogResult = DialogResult.OK;
} else {
lblStatus.Text = "";
this.Enabled = true;
MessageBox.Show("Los datos introducidos no son correctos. Inténtelo de nuevo.", title, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void TextBox_TextChanged(object sender, EventArgs e) {
TextBox modelBox = new TextBox();
bool activate = false;
foreach (Control elementForm in this.Controls) if (elementForm.GetType() == modelBox.GetType()) if (elementForm.Text != "") activate = true;
this.btnClean.Enabled = activate;
}
private void TextBox_KeyPress(object sender, KeyPressEventArgs e) {
string validChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.-_ ";
if (validChars.IndexOf(e.KeyChar) == -1 && e.KeyChar != Convert.ToChar('\r') && e.KeyChar != Convert.ToChar('\b') && e.KeyChar != Convert.ToChar('\t')) e.Handled = true;
else e.Handled = false;
}
private void TextBox_Enter(object sender, EventArgs e) {
TextBox model = (TextBox) sender;
model.SelectAll();
}
private void frmLogin_FormClosing(object sender, FormClosingEventArgs e) { if (e.CloseReason == CloseReason.UserClosing || e.CloseReason == CloseReason.TaskManagerClosing || e.CloseReason == CloseReason.WindowsShutDown) this.DialogResult = DialogResult.Cancel; }
}
}
Como podeis ver, en frmPrincipal.cs el código lo pongo en el evento Shown, si lo pongo en Load hace exactamente lo mismo. Si hago clic en el menú salir he comprobado en debug paso a paso que tras terminar Application.Run no hace nada más y se queda parado pero no termina el programa nunca. Os he MARCADO EN ROJO los trozos de código que están implicados en lo que he explicado, el resto está todo correcto.
Haber si algun@ sois capaz de ver lo que yo no veo.