2009-03-18 58 views

Respuesta

9

Se podría enlazar el evento cambiado, y establecer el valor de nuevo a su valor deseado (si es diferente) - de esta manera usted cubrirá cualquier causa de cambio (mediante el mouse o el teclado)

¿Ha considerado utilizar un control diferente, como un cuadro de texto de solo lectura o incluso un control de etiqueta?

0

controlar el evento DateTimePicker.MouseClick y establezca el event.handled a cierto

+0

También había necesidad de desactivar la entrada de teclado que cambie el valor –

1

"No estoy contento con la pantalla si está desactivado"

¿Por qué? Si se debe a que un cuadro de texto deshabilitado tiene un aspecto extraño, puede cambiar el estilo deshabilitado para que se vea normal, o indicar de una manera más bonita que acepta la entrada solo a través del selector de fecha. Posiblemente no tenga fronteras, para decir que no es realmente un cuadro de texto.

+0

¿Me puede indicar que la propiedad es que, por favor? Pensé que no podía cambiar el estilo desactivado en winforms, pero si es posible, me gustaría. Muchas gracias. –

+0

Lo siento ... han pasado más de cuatro años y no recuerdo nada de esta respuesta o de lo que estaba hablando :( –

0

¿Qué tal si solo seleccionas el evento Modificado y configuras e.Cancel = true?

+0

Esto no funcionaría. El evento es Chang ** ed **. Como en el valor ya se ha modificado. No se puede simplemente cancelar. –

-3

Prueba esto:

private void dateTimePicker1_ValueChanged(object sender, EventArgs e) 
    { 
     dateTimePicker1.Value = DateTime.Now; 
    } 
+7

'DateTime.Now' no es el único valor que desea usar. –

0
No

la mejor manera de hacerlo sin que esto signifique detener la actualización de fecha y hora por keyUp

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
    } 

    private DateTime originalValue; 

    private void dateTimePicker1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
    { 
     originalValue = dateTimePicker1.Value; 
    } 

    private void dateTimePicker1_ValueChanged(object sender, EventArgs e) 
    { 
     dateTimePicker1.Value = originalValue; 
    } 
} 
0
  1. Tenemos que recordar en primer lugar fecha y hora originales.

    procedure TForm1.dtpDateEnter(Sender: TObject); 
    begin 
        oldDtpDate := dtpDate.DateTime; 
    end; 
    
  2. procedimiento TForm1.dtpDateClick (Sender: TObject); begin dtpDate.DateTime: = oldDtpDate; final;

    procedure TForm1.dtpDateExit(Sender: TObject); 
    begin 
        dtpDate.DateTime := oldDtpDate; 
    end; 
    
5

Sé que esto es muy antiguo, pero para ayudar a cualquier persona en busca de esto (como lo fue la primera que encontré a través de Google) Puede utilizar:

this.dateTimePicker1.Enabled = false; 

para que sea actuar de la misma manera que lo haría un cuadro de texto con this.textbox1.ReadOnly = true

+0

Solución simple que pasé por alto totalmente (como es habitual). Funcionó para mi caso. La única forma en que esto La solución no sería tan deseable, si no le gusta el aspecto en gris que no obtiene con 'ReadOnly = true'. –

0

Una forma de hacerlo es limitar el rango permitido de fechas a un único valor.

dateTimePicker.MinDate = dateTimePicker.Value; 
dateTimePicker.MaxDate = dateTimePicker.Value; 
3

Esta pregunta - después de seis años - todavía parece tener cierto interés por lo que voy a tirar en mis 2 centavos: Lo que funciona para mí es 1) Hacer un control de usuario y cambiar la clase base a DateTimePicker 2) Tome una pequeña instantánea de mapa de bits del control cada vez que cambie el valor. 3) Intercepte el mensaje WM_PAINT y, si nuestro control está desactivado, dibuje el mapa de bits en lugar del control. (Nota: propiedad AutoScaleMode en el diseñador.cs hace error de compilación por lo que sólo eliminar)

public partial class DateTimePickerWithReadOnly : DateTimePicker 
{ 
    Bitmap ReadOnlyImage; 
    // We maintain a "shadow" control to avoid capturing selections in the snapshot. 
    // If you use different formatting or styles just make sure the shadow is set to match! 
    DateTimePicker Shadow = new DateTimePicker(); 
    public DateTimePickerWithReadOnly() 
    { 
    InitializeComponent(); 
    CaptureBitmap(); 
    this.ValueChanged += new EventHandler(DateTimePickerWithReadOnly_ValueChanged); 
    } 
    private void CaptureBitmap() 
    { 
    Shadow.Value = Value; 
    Shadow.Size = Size; 
    ReadOnlyImage = new Bitmap(Width, Height); 
    Shadow.DrawToBitmap(ReadOnlyImage, new Rectangle(0, 0, Size.Width, Size.Height)); 
    } 
    void DateTimePickerWithReadOnly_ValueChanged(object sender, EventArgs e) 
    { 
    CaptureBitmap(); 
    } 
    protected override void DefWndProc(ref Message m) 
    { 
    base.DefWndProc(ref m); 
    // WM_PAINT is 0x000F 
    if ((m.Msg == 0x000F) && !Enabled) 
    { 
     Graphics g = base.CreateGraphics(); 
     g.DrawImage(ReadOnlyImage, new Rectangle(0, 0, Size.Width, Size.Height)); 
     g.Dispose(); 
    } 
    } 
} 
Cuestiones relacionadas