Principales respuestas
Problemas con Thread.Sleep(3000)

Pregunta
-
Tengo 2 métodos,
primero: realizo una consulta en SQL, lleno un datagridview y valido que el datagridview traiga datos, en caso de que no traiga datos envía un correo dando aviso.
segundo: si trae datos lo que hago es cerrar ese form
ahora, el problema radica es que cuando valida que trae datos cierra inmediatamente el form sin haber llenado el datagridview entonces me muestra un error, ya que sin cargar el datagriedview se esta cerrando.
espero ser mas claro, al pinchar el botón que realiza esto
private void aRSToolStripMenuItem_Click(object sender, EventArgs e)
{
Form Formulario = new frmARS();
Formulario.Show();
}cuando abre el formulario ejecuta ambos métodos (el segundo luego de validar tiene un close();)
entonces pensé solucionarlo con un Thread.Sleep(3000) para que en esos 3 segundos llenara el datagriedview, pero no trabaja como quiero que lo haga, al final pincho el botón y termina retrasando toda la ejecución 3 segundos(no el segundo metodo que es como lo necesito).
espero haber sido claro, igual quedo atento.
saludos.
Respuestas
-
Es que ya no ocupa hacer el Show. De hecho, ya no ocupa un formulario completo para eso.
Mueva el código a una clase y desecha frmARS.
Jose R. MCP
Code Samples- Marcado como respuesta Santiago Agudelo L jueves, 19 de abril de 2018 16:02
Todas las respuestas
-
Creo que sí ha sido claro. Lo que no comprendo es por qué tiene necesidad de usar un DGV, que es un control específicamente diseñado para interacción con un usuario de una forma que no es para lo que se diseñó. Si no hay datos, envía un correo-e; si los hay, el usuario no tiene permitido verlos o modificarlos. Entonces ¿cuál es la necesidad de tener un DGV en primer lugar?
Pienso que si eliminamos el DGV sus problemas se simplificarán. Explique su necesidad actual de tener un DGV y el objetivo final que desea conseguir.
Jose R. MCP
Code Samples -
hola
>>cuando abre el formulario ejecuta ambos métodos (el segundo luego de validar tiene un close();)
no entiendo, porque cierras el form cuando cargas el grid, eso no tiene sentido
se supone que si abres un form que carga un grid es para visualizar la lista
>>entonces pensé solucionarlo con un Thread.Sleep(3000) para que en esos 3 segundos llenara el datagriedview,
no pensaste usar un Timer ? entonces lanzas la consulta y con un timer en el evento Tick realizas la operacion despues del tiempo
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina -
Hola Jose, resulta que esto será una herramienta de diagnostico que se debe gestionar automáticamente, pero en caso de que envié el correo porque no encuentra datos, debo entrar a gestionar la herramienta manualmente.
InitializeComponent();
ARS(dataGridView1);
validar();el error aparece es cuando invoco el formulario, porque es como si le digo que muestre el formulario, pero lo primero que inicializa el formulario es un close();
public void validar()
{
try
{
if (dataGridView1.Rows.Count > 1)
{
Thread.Sleep(3000);
Close();
/* MessageBox.Show("Se cerrara esta maricada");
/*Close();*/
}
}
catch (Exception ex)
{
MessageBox.Show(""+ex);
}
}
intente adjuntar unos pantallazos pero no fue posible, espero que con el código sea un poco mas claro
saludos por la pronta respuesta
-
>>no entiendo, porque cierras el form cuando cargas el grid, eso no tiene sentido
>>se supone que si abres un form que carga un grid es para visualizar la lista
Hola Leandro, resulta que esto será una herramienta de diagnostico que se debe gestionar automáticamente, pero en caso de que envié el correo porque no encuentra datos, debo entrar a gestionar la herramienta manualmente.
entonces cuando este trabajando automáticamente claramente es un desperdicio llenar un datagriedview, pero en el momento de un fallo sera de utilidad saludos.
-
Ok, pero viera que no responde mi pregunta. ¿Por qué necesita un DGV? ¿No puede acaso validar los datos en una colección de clases o un DataTable (que no me gustan, pero bueno, sería mejor que un DGV)?
Jose R. MCP
Code Samples -
-
Ok. ¿Cómo llena usted el DGV? Porque si es para acceder a la cuenta de registros, el DGV tiene que eliminarse sí o sí. Le puedo enseñar cómo, pero necesito saber cómo obtiene usted los datos.
Jose R. MCP
Code Samples -
te adjunto el código del llenado
public void ARS(DataGridView dataGridView1)
{
DateTime Ahora = DateTime.Now;
string AhoraString = Ahora.ToString("yyyy-MM-dd HH:mm:ss.FFF");
DateTime Ahora1 = Ahora.AddMinutes(-30);
string Ahora1String = Ahora1.ToString("yyyy-MM-dd HH:mm:ss.FFF");
try
{
da = new SqlDataAdapter("select top 10 Logic_code,Fecha,Intensidad,VehiculoLongitud1,VehiculoLongitud2,VehiculoLongitud3,Ocupacion,Velocidad from xxxx..xxx where Logic_code in (select ELEM_GEN_COD_LOG " +
"from zzzz..zzzzz where TIP_EQUIP_CODIGO = 3 and ELE_TIP_EQUIP_CODIGO is null) and fecha between '" + Ahora1String + "' and '" + AhoraString + "' order by fecha desc ", cn);
dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
}
catch (Exception ex)
{
MessageBox.Show("no se pudo llenar el datagridview" + ex.ToString());
} -
hola
>>entonces cuando este trabajando automáticamente claramente es un desperdicio llenar un datagriedview, pero en el momento de un fallo sera de utilidad
sigo si entender porque cierras el form, si tienes algo automatico que no requiere interaccion porque abres un form desde un menu? eso no tiene sentido
>>la verdad las realizo desde el DGV porque me parece la forma mas fácil de validar ya que reviso el datagridview.Rows.Count==1
pesima idea, si no vas a tener interacion con el usuario valida desde los datos directamente, crea una clase que retorne la informacion y usala, pero no lances un form
el codigo que realiza el select a la db llevalo a una clase para poder reutilizarlo, usa una arquitectura la menos de 2 capas, como explico aqui
entonces valida los datos, NUNCA el grid sie s que no vas a listar esto al usuario
eso de abrir un form, validar y cerrarlo es pesimo
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Editado Leandro TuttiniMVP jueves, 19 de abril de 2018 15:29
-
Ok, hay muchas cosas que no me gustan de ese código, pero como usted dice que no conoce otras formas, voy simplemente a darle 2 opciones:
- La variable dt que veo ahí es un DataTable. Ese objeto tiene la propiedad Rows, que a su vez tiene la propiedad Count. No ocupa el DGV. Puede validar que hay datos haciendo if (dt.Rows.Count > 0).
- Si no va a hacer nada con los datos, en vez de hacer un SELECT TOP 10 de columnas, simplemente haga un SELECT COUNT(*) FROM ... Entonces simplemente ejecutamos el código y leemos la primera celda de la primera fila del DataTable.
Jose R. MCP
Code Samples- Editado webJoseModerator jueves, 19 de abril de 2018 15:34
-
He realizado la modificación que me indicas
dt = new DataTable();
da.Fill(dt);
if(dt.Rows.Count > 1 )
{
Close();
}tomando que si es mayor que 1 es porque trajo encabezados y algún dato mas, se supone que esta bien y se puede cerrar, pero al ejecutar el close(); me genera el mismo problema
me dice que el error esta acá
public void button1_Click(object sender, EventArgs e)
{
Form frm = new frmARS();
frm.Show();
}System.ObjectDisposedException: 'No se puede obtener acceso al objeto desechado.
Nombre del objeto: 'frmARS'.'pero estoy casi seguro que como invoca el frmARS y el método que inicializa si esta bien lo cierra.
-
Es que ya no ocupa hacer el Show. De hecho, ya no ocupa un formulario completo para eso.
Mueva el código a una clase y desecha frmARS.
Jose R. MCP
Code Samples- Marcado como respuesta Santiago Agudelo L jueves, 19 de abril de 2018 16:02
-
hola
>>tomando que si es mayor que 1 es porque trajo encabezados y algún dato mas, se supone que esta bien y se puede cerrar, pero al ejecutar el close(); me genera el mismo problema
pero porque abres un form sino vas a queres una interaccion visual?, crea una clase para usarla desde el boton, no pongas ese codigo en un form, es una pesima idea
despeus si desde el boton necesitas a veces mostrar el form y otras no, puede definirlo por configuracion, y cambiarlo segun necesites
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Editado Leandro TuttiniMVP jueves, 19 de abril de 2018 15:53