Как установить DateTimePicker только для чтения?
У меня есть DateTimePicker (nullable version), который мне нужно только прочитать. Я не доволен дисплеем, если он отключен, поэтому хотел бы знать, есть ли у кого-нибудь отличный пример того, как остановить обновления на поле?
спасибо.
10 ответов
вы можете подключить измененное событие и установить значение обратно в нужное значение (если отличается) -- таким образом, вы будете покрывать любую причину изменения (с помощью мыши или клавиатуры)
вы рассматривали использование другого элемента управления, такого как текстовое поле только для чтения или даже элемент управления label?
Я знаю, что это очень старый, но чтобы помочь кому-либо еще искать это (так как это был первый, который я нашел через google), вы можете использовать:
this.dateTimePicker1.Enabled = false;
чтобы заставить его действовать так же, как текстовое поле с this.textbox1.ReadOnly = true
этот вопрос-после шести лет-по-прежнему кажется, чтобы получить какой-то интерес так что я буду кидать в мои 2 цента: то, что работает для меня-это 1) Сделать UserControl и измените базовый класс элемента управления datetimepicker 2) Возьмите немного растрового снимка контроль всякий раз, когда значение изменяется 3) Перехват сообщения WM_PAINT сообщение и если наш элемент управления отключен нарисовать растровое изображение, а не контроль. (Примечание: свойство AutoScaleMode в конструкторе.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();
}
}
}
"Я не доволен дисплеем, если он отключен"
почему? Если это потому, что отключенное текстовое поле выглядит странно, вы можете просто изменить отключенный стиль, чтобы он выглядел нормально, или указать более красивым способом, что он принимает ввод только через средство выбора даты. Возможно, у него нет границ, чтобы сказать, что это не текстовое поле.
Не самый лучший способ сделать это, но это останавливает обновление 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;
}
}
-
сначала мы должны вспомнить исходное время datetime.
procedure TForm1.dtpDateEnter(Sender: TObject); begin oldDtpDate := dtpDate.DateTime; end;
-
процедура TForm1.dtpDateClick (отправитель: TObject); начинать dtpDate.DateTime: = oldDtpDate; конец;
procedure TForm1.dtpDateExit(Sender: TObject); begin dtpDate.DateTime := oldDtpDate; end;
один из способов сделать это-просто ограничить допустимый диапазон дат одним значением.
dateTimePicker.MinDate = dateTimePicker.Value;
dateTimePicker.MaxDate = dateTimePicker.Value;
попробуйте это:
private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
dateTimePicker1.Value = DateTime.Now;
}