Pregunta

Hechos:

  • Tengo un TabControl con 2 pestañas, cada pestaña tiene 2 DateTimePicker.
  • En el evento de carga, establezco el valor de todos los DTP.
  • Todos los DTP tienen ShowCheckBoxes establecidos en verdadero Y marcado en falso.
  • Cuando ejecuto el programa, los DTP en la primera pestaña están bien, pero cuando reviso los DTP en la segunda pestaña, muestran la hora actual, no la hora establecida en el evento de carga.

¿Por qué sucede esto? ¿Cómo puedo evitarlo?

¿Fue útil?

Solución 3

Mi solución fea para este problema consiste en establecer activa la pestaña en la que residen los DTP antes de cambiar sus valores, algo así:

DateTime dat1 = DateTime.Today;
DateTime dat2 = dat1.AddDays(1).AddSeconds(-1);

dtpCreatedStart.Value = dat1;
dtpCreatedEnd.Value = dat2;
tbc.SelectTab(1);
dtpModifiedStart.Value = dat1;
dtpModifiedEnd.Value = dat2;
tbc.SelectTab(0);

Otros consejos

Descubrí cuál era el problema aquí.

La propiedad Value solo establece un nuevo valor si el control DateTimePicker es visible. De lo contrario, se ignora el comando.

Caso de prueba:

No funciona:

 this.picker = new DateTimePicker
        {
            Checked = false,
            Font = new System.Drawing.Font("Verdana", 9.75F),
            Format = System.Windows.Forms.DateTimePickerFormat.Time,
            Location = new System.Drawing.Point(5, 5),
            Name = "picker",
            ShowUpDown = true,
            Size = new System.Drawing.Size(120, 23),
            Visible = false
        };
        this.Controls.Add(this.picker);
        this.picker.Value = this.picker.Value.Date.AddHours(1);
        this.picker.Visible = true;

Obras:

 this.picker = new DateTimePicker
        {
            Checked = false,
            Font = new System.Drawing.Font("Verdana", 9.75F),
            Format = System.Windows.Forms.DateTimePickerFormat.Time,
            Location = new System.Drawing.Point(5, 5),
            Name = "picker",
            ShowUpDown = true,
            Size = new System.Drawing.Size(120, 23),
            Visible = false
        };
        this.Controls.Add(this.picker);
        this.picker.Visible = true;
        this.picker.Value = this.picker.Value.Date.AddHours(1);

No parece tener nada que ver con agregar programáticamente el selector que parece.

Tiene que ver con la propiedad Checked del datetimepicker. Por lo general, se establece en falso. Al menos ese era el problema para mí.

Después de establecer datetimepicker.checked en true, recuperó el valor de la configuración.

DateTimePicker tiene algunos problemas con el almacenamiento y la recuperación de su valor. Tuve problemas al vincular el valor con un DateTime no anulable: recibí NullReferenceExeptions de vez en cuando. No tengo idea de por qué o cuándo. A veces simplemente sucedió y bloqueó la aplicación.

Me encontré con el mismo problema usando dos DateTimePicker. Pude hacer que ambos mostraran el valor correcto generándolos dinámicamente y agregándolos al formulario.

Si no puede hacerlo funcionar, siempre puede intentar usar un selector diferente. El Cualquier + Time (TM) Datepicker / Timepicker AJAX Calendar Widget saca su valor del campo asociado, por lo tanto, si inicializa el campo con un valor, o cambia un campo para que tenga un valor (como en onload), eso es lo que obtendrá cuando se muestre el selector. Y si tiene problemas con eso, simplemente envíe un mensaje a través de la página de contacto, y se resolverá lo antes posible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top