2009-03-18 10 views
9

J'ai un DateTimePicker (version nullable) que j'ai besoin d'être en lecture seule. Je ne suis pas heureux avec l'affichage si elle est désactivée, donc je voulais savoir si quelqu'un avait un exemple astucieux de la façon d'arrêter les mises à jour sur le terrain?Comment définir un DateTimePicker en lecture seule?

Merci.

Répondre

9

Vous pouvez accrocher l'événement Changed, et définissez la valeur à votre valeur désirée (si différente) - cette façon, vous couvrirez toute cause de changement (via la souris ou le clavier)

Avez-vous envisagé d'utiliser un contrôle différent, comme une lecture seule zone de texte ou même un contrôle d'étiquette?

0

gérer l'événement DateTimePicker.MouseClick et régler la event.handled true

+0

Vous auriez besoin également désactiver l'entrée du clavier qui modifie la valeur –

1

"Je ne suis pas satisfait de l'écran si elle est désactivée"

Pourquoi? Si c'est parce qu'une boîte de texte désactivée semble bizarre, vous pouvez juste changer le style désactivé pour le rendre normal, ou indiquer d'une manière plus jolie qu'il n'accepte les entrées qu'à travers le sélecteur de date. N'avez peut-être pas de frontières, pour dire que ce n'est pas vraiment une boîte de texte.

+0

Pouvez-vous me montrer que la propriété est que, s'il vous plaît? Je pensais que je ne pouvais pas changer le style handicapé en winforms, mais si c'est possible, j'aimerais le faire. Merci beaucoup. –

+0

Désolé ... cela fait plus de quatre ans maintenant et je ne me souviens pas d'une chose à propos de cette réponse ou de ce dont je parlais :( –

0

Que diriez-vous simplement ramasser l'événement Changed et la mise en e.Cancel = true?

+0

Cela ne fonctionnerait pas. L'événement est Chang ** ed **. –

-3

Essayez ceci:

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

'DateTime.Now' n'est pas la seule valeur que vous voulez pouvoir utiliser –

0

pas la plus belle façon de le faire, mais cela ne s'arrête la mise à jour par datetime 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. Il faut se rappeler d'abord datetime d'origine.

    procedure TForm1.dtpDateEnter(Sender: TObject); 
    begin 
        oldDtpDate := dtpDate.DateTime; 
    end; 
    
  2. procédure

    TForm1.dtpDateClick (Sender: TObject); début dtpDate.DateTime: = oldDtpDate; fin;

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

Je sais que cela est très vieux mais pour aider quelqu'un d'autre recherche de ce (comme ce fut le premier que j'ai trouvé par google) Vous pouvez utiliser:

this.dateTimePicker1.Enabled = false; 

pour le rendre agissent de la même manière qu'une zone de texte avec this.textbox1.ReadOnly = true

+0

Solution simple que j'ai complètement oubliée (comme d'habitude). solution ne serait pas tout ce qui est souhaitable, c'est si vous n'aimiez pas le look grisé que vous n'obtenez pas avec ReadOnly = true. –

0

Une façon que j'ai fait est de simplement contraindre la plage admissible de dates à une seule valeur.

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

Cette question - au bout de six ans - semble encore obtenir un certain intérêt, donc je vais jeter mes 2 cents: Ce qui fonctionne pour moi est 1) Faire un UserControl et changer la classe de base à 2 DateTimePicker Prenez un petit instantané bitmap du contrôle chaque fois que la valeur change 3) Interceptez le message WM_PAINT et si notre contrôle est désactivé, dessinez le bitmap à la place du contrôle. (Remarque: propriété AutoScaleMode dans le concepteur.cs fait erreur de compilation si juste enlever)

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(); 
    } 
    } 
} 
Questions connexes