Как установить DateTimePicker только для чтения? - PullRequest
9 голосов
/ 18 марта 2009

У меня есть DateTimePicker (обнуляемая версия), который мне нужно только для чтения. Я не доволен отображением, если оно отключено, поэтому хотел узнать, есть ли у кого-нибудь отличный пример того, как остановить обновления на поле?

Спасибо.

Ответы [ 12 ]

9 голосов
/ 18 марта 2009

Вы можете перехватить событие Changed и установить значение обратно на желаемое значение (если оно отличается) - таким образом вы сможете устранить любую причину изменения (с помощью мыши или клавиатуры)

Рассматривали ли вы использование другого элемента управления, такого как текстовое поле только для чтения или даже элемент управления меткой?

8 голосов
/ 27 июня 2014

Я знаю, что это очень старо, но чтобы помочь кому-то еще, ищущему это (поскольку это был первый, который я нашел через Google), Вы можете использовать:

this.dateTimePicker1.Enabled = false;

, чтобы заставить его работать так же, как текстовое поле с this.textbox1.ReadOnly = true

3 голосов
/ 13 октября 2015

Этот вопрос - спустя шесть лет - кажется, все еще вызывает некоторый интерес, поэтому я добавлю свои 2 цента: у меня работает 1) Создайте UserControl и измените базовый класс на DateTimePicker. Снимок растрового изображения элемента управления при изменении значения 3) Перехватить сообщение WM_PAINT, и если наш элемент управления отключен, нарисуйте растровое изображение вместо элемента управления. (Примечание: свойство AutoScaleMode в designer.cs приводит к ошибке компиляции, поэтому просто удалите)

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();
    }
  }
}
1 голос
/ 18 марта 2009

«Я не доволен дисплеем, если он отключен»

Почему? Если это потому, что отключенное текстовое поле выглядит странно, вы можете просто изменить отключенный стиль, чтобы он выглядел нормально, или указать более привлекательным образом, что оно принимает ввод только через средство выбора даты. Возможно, у него нет границ, скажем, это не текстовое поле.

0 голосов
/ 29 мая 2019

dateTimePicker2.Enabled = false;

0 голосов
/ 18 октября 2018

В качестве другого предложения: используйте текстовое поле (или ярлык) и делайте его только для чтения. Выведите в нем значение, которое вы хотите.

Если вам нужно иметь указатель даты и времени, создайте и указатель даты, и текстовое поле. Положите их друг на друга. Когда вам понадобится указатель даты и времени, спрятать текстовое поле. И т.д.

0 голосов
/ 15 мая 2015

Один из способов сделать это - просто ограничить допустимый диапазон дат одним значением.

dateTimePicker.MinDate = dateTimePicker.Value;
dateTimePicker.MaxDate = dateTimePicker.Value;
0 голосов
/ 12 июня 2014
  1. Сначала мы должны запомнить исходное время.

    procedure TForm1.dtpDateEnter(Sender: TObject);
    begin
      oldDtpDate := dtpDate.DateTime;
    end;
    
  2. процедура TForm1.dtpDateClick (Отправитель: TObject); начать dtpDate.DateTime: = oldDtpDate; конец;

    procedure TForm1.dtpDateExit(Sender: TObject);
    begin
      dtpDate.DateTime :=  oldDtpDate;
    end;
    
0 голосов
/ 23 мая 2012

Не самый лучший способ сделать это, но это останавливает обновление 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 голосов
/ 24 ноября 2010

Попробуйте это:

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