Winforms DateTimePicker установить текст по умолчанию и / или значение - PullRequest
1 голос
/ 21 марта 2012

У меня есть DateTimePicker с ShowCheckBox = true в моем приложении winforms. Если я сделаю это в конструкторе форм:

        DateFrom.Checked = true;
        DateFrom.Value = DateTime.Today.AddDays(-7);

Затем установите DateFrom.Checked = false; в событии FormShown он делает то, что хотел бы, текст в элементе управления по умолчанию равен 7 дням до сегодняшнего дня, и флажок снят.

Если я попытаюсь установить только значение, текст останется таким же, как сегодня. Если я сброслю Checked = false в любое время до события FormShown, текст останется таким же, как сегодня.

Теперь я переместил этот код в пользовательский элемент управления, поэтому для использования того же «хака» потребуется еще больше взлома, поэтому на данный момент я надеюсь, что у кого-то есть более простой метод. Может быть, просто еще одно свойство, которое я могу установить, кроме значения, которое действительно работает? :)

Я пробовал это также:

        DateFrom.Text = DateTime.Today.ToString(DateFrom.CustomFormat);

Вместо установки значения или в дополнение к нему безрезультатно.

Ответы [ 3 ]

1 голос
/ 21 марта 2012

Как правило, я пытался часами, прежде чем опубликовать свой вопрос, затем сразу после того, как я подумал, что это может как-то быть связано с созданием дескриптора окна. Поэтому я придумала это решение. Я все еще буду счастлив иметь что-то лучшее, но это не кажется плохим, если мне придется остаться с этим:

        DateFrom.Checked = true;
        DateFrom.Value = DateTime.Today.AddDays(-7);
        if (DateFrom.Handle == null)
            System.Threading.Thread.Sleep(0);
        DateFrom.Checked = false;

Проверка дескриптора вынуждает создавать дескриптор окна, поэтому я могу снять флажок с элемента управления без значения по умолчанию текущей даты для текста, когда дескриптор окна создается позже. Я просто использую Sleep (0) как трюк, чтобы убедиться, что компилятор не оптимизирует код и не скомпилирует его все вместе (не уверен, что это вообще произойдет, но хотел бы быть уверен, и условие не всегда должно быть ложным) так что никогда не спать (0) в любом случае).

0 голосов
/ 16 декабря 2017

Я изменил ваш собственный ответ и сделал его так:

public ProcessFailureForm()
{
    InitializeComponent();

    //Blah blah blah

    dtFrom.HandleCreated += delegate //if you need sender or EventArgs use: delegate(object sender, EventArgs e)
    {
        dtFrom.Checked = true;
        dtFrom.Value = DateTime.Today.AddDays(-7);
        dtFrom.Checked = false;
    };
}

Обновление:

На самом деле сначала я думаю, как вы, но после этого я попытался найтииз-за того, что проверенное состояние не повлияет на процесс ... поэтому его можно уменьшить до:

public ProcessFailureForm()
{
    InitializeComponent();

    //Blah blah blah

    dtFrom.HandleCreated += delegate //if you need sender or EventArgs use: delegate(object sender, EventArgs e)
    {
        dtFrom.Value = DateTime.Today.AddDays(-7);
    };
}
0 голосов
/ 10 июля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...