Error programando las tareas (C#)

Iniciado por Hartigan, 9 Septiembre 2010, 04:47 AM

0 Miembros y 1 Visitante están viendo este tema.

Hartigan

HOla compis bueno pues os comento que al final he decidido programar yo mismo las tareas de mi agenda usando las clases del programador de tareas de windows. Entonces he conseguido ya programar algunas tareas pero no consigo establecer algunos parametros referentes al IRepetitionPattern y son el Duration y el INterval.

mi código:

Código (csharp) [Seleccionar]

TaskSchedulerClass scheduler = new TaskSchedulerClass();
           scheduler.Connect(null, null, null, null);

           ITaskDefinition task = scheduler.NewTask(0);
           
           task.RegistrationInfo.Author = autor;
           task.RegistrationInfo.Description = descripcion;

           ITaskSettings settings = task.Settings;
           settings.Enabled = true;
           settings.Hidden = false;
           
          switch(recurrencia)
           {
               case "horaria":
                   
                  ITimeTrigger trigger = (ITimeTrigger)task.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_TIME);
                  trigger.Enabled = true;
                  trigger.Id = nombre;
                 
                  trigger.StartBoundary = fecha.Substring(6, 4).ToString() + "-" + fecha.Substring(3, 2).ToString() + "-" + fecha.Substring(0, 2).ToString() +
                      "T" + hora;
                  if(fechaFin != string.Empty)
                  {
                      trigger.EndBoundary = fechaFin.Substring(6, 4).ToString() + "-" + fechaFin.Substring(3,2).ToString() + "-" + fechaFin.Substring(0, 2).ToString() +
                          "T" + horaFin;
                  }
                  break;

              case "diaria":
                  IDailyTrigger dailyTrigger = (IDailyTrigger)task.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_DAILY);
                  dailyTrigger.Enabled = true;
                  dailyTrigger.Id = nombre;
                  dailyTrigger.DaysInterval = Convert.ToInt16(textBoxDia.Text.ToString());
                  IRepetitionPattern rp = (IRepetitionPattern)dailyTrigger.Repetition;
                /*  if (checkBoxRepetir.Checked == true)
                  {
                      rp.Duration = TimeSpan.FromMinutes(int.Parse(this.textBoxDuracion.Text.ToString());
                      rp.Interval = TimeSpan.FromMinutes(60);
                     
                  }*/
                  dailyTrigger.StartBoundary = fecha.Substring(6, 4).ToString() + "-" + fecha.Substring(3, 2).ToString() + "-" + fecha.Substring(0, 2).ToString() +
                      "T" + hora;
                  if (fechaFin != string.Empty)
                  {
                      dailyTrigger.EndBoundary = fechaFin.Substring(6, 4).ToString() + "-" + fechaFin.Substring(3, 2).ToString() + "-" + fechaFin.Substring(0, 2).ToString() +
                          "T" + horaFin;
                  }
                 
                  break;
           }

           
           IShowMessageAction mensaje = (IShowMessageAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_SHOW_MESSAGE);
           mensaje.Id = "My mensaje";
           mensaje.Title = titulo;
           mensaje.MessageBody = mensaje.ToString();

           ITaskFolder root = scheduler.GetFolder("\\");
           IRegisteredTask regTask = root.RegisterTaskDefinition(nombre, task, (int)_TASK_CREATION.TASK_CREATE_OR_UPDATE, null, null, _TASK_LOGON_TYPE.TASK_LOGON_NONE, "");
         ...
....



Lo que está comentado es lo que no consigo hacer funcionar he visto algunos ejemplos y debería estar bien pero a mi no me funcoina porque me dice que no se puede convertir el tipo string en TimeSpan. Como podria hacerlo???

Salu2.

Hartigan

Bueno me respondo diciendo que ya me ha funcionado. ya programo tareas en mi agenda. xDD ;-)

[D4N93R]

Yo estaba por responderte xD Pero bueno, postea tu solución a ver que tal.

Hartigan

jejeje, el problema estaba en que el valor de la duración tenia que ser mayor que la del intervalo de repetición por eso me daba error. Lo he dejado así:

Código (csharp) [Seleccionar]


....

TaskSchedulerClass scheduler = new TaskSchedulerClass();
           scheduler.Connect(null, null, null, null);

           ITaskDefinition task = scheduler.NewTask(0);
           
           task.RegistrationInfo.Author = autor;
           task.RegistrationInfo.Description = descripcion;

           ITaskSettings settings = task.Settings;
           settings.Enabled = true;
           settings.Hidden = false;

           try
           {

               switch (recurrencia)
               {
                   case "horaria":

                       ITimeTrigger timeTrigger = (ITimeTrigger)task.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_TIME);
                       timeTrigger.Enabled = true;
                       timeTrigger.Id = nombre;

                       timeTrigger.StartBoundary = fecha.Substring(6, 4).ToString() + "-" + fecha.Substring(3, 2).ToString() + "-" + fecha.Substring(0, 2).ToString() +
                           "T" + hora;
                       if (fechaFin != string.Empty)
                       {
                           timeTrigger.EndBoundary = fechaFin.Substring(6, 4).ToString() + "-" + fechaFin.Substring(3, 2).ToString() + "-" + fechaFin.Substring(0, 2).ToString() +
                               "T" + horaFin;
                       }

                       if (checkBoxRepetir.Checked == true)
                       {
                           if (duracion != string.Empty)
                               timeTrigger.Repetition.Duration = duracion;
                           timeTrigger.Repetition.Interval = "PT" + repeticion.ToString() + "M";
                       }
                       break;

                   case "diaria":

                       IDailyTrigger dailyTrigger = (IDailyTrigger)task.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_DAILY);
                       dailyTrigger.Enabled = true;
                       dailyTrigger.Id = nombre;
                       dailyTrigger.StartBoundary = fecha.Substring(6, 4).ToString() + "-" + fecha.Substring(3, 2).ToString() + "-" + fecha.Substring(0, 2).ToString() +
                           "T" + hora;
                       if (fechaFin != string.Empty)
                       {
                           dailyTrigger.EndBoundary = fechaFin.Substring(6, 4).ToString() + "-" + fechaFin.Substring(3, 2).ToString() + "-" + fechaFin.Substring(0, 2).ToString() +
                               "T" + horaFin;
                       }
                       dailyTrigger.DaysInterval = Convert.ToInt16(textBoxDia.Text.ToString());

                       if (checkBoxRepetir.Checked == true)
                       {
                           if (duracion != string.Empty)
                               dailyTrigger.Repetition.Duration = duracion;
                           dailyTrigger.Repetition.Interval = "PT" + repeticion.ToString() + "M";
                       }

                       break;

.....
...



Espero que le sirva a alguien.

Salu2 ;)

Hartigan

Tengo un nuevo problema y es el siguiente.

en un formulario tengo los 12 meses del año, cada uno es un checkBox.

Necesito pasar datos a una variable de la siguiente forma:


variable = 2|4|8

Esos números son los meses del año marcados del formulario. Como podría hacerlo???

gracias de antemano.

[D4N93R]

Si es string tienes dos formas:

1.- Muchos if y verifica que cuando uno este checked le concatenas el valor al string..
2.- Esta es mejor, metes los checkboxes dentro de un panel o algo, y haces un foreach (control c in nombredelpanel.Controls) dentro del foreach verificas si c es de tipo CheckBox, esto lo haces así: if(c is CheckBox) si es afirmativo entonces verificas el checked y haces lo que tengas que hacer, en este caso concatenar el valor del checkbox.

El valor lo puedes tener guardado en una propiedad llamada tag que tienen todos los controles.

Saludos!

Hartigan

esque la variable no es un string, sno que es un short!!!!! ya había probado a concatenar todo mediante if's pero claro, al convertirla a short no me la reconoce bien...

[D4N93R]

Revisa si es flag esa propiedad.. si es así puedes hacerlo , sino, hay algo mal.

Hartigan


[D4N93R]

Bueno puedes hacer un enum con los valores Hexadecimales y luego hacer bitwise. De esa forma puedes pasar los meses que quieras.

Por ejemplo

Código (csharp) [Seleccionar]
short january  =0X01    ;// binario es 0000000001
short october =0X200   ;// binario es 1000000000
long result=january  & october ; //binario es 1000000001


Fíjate que es & y no && que es diferente.

Un saludo!