Ярлыки С# (изменение цвета метки)

В приложении формы Windows у меня есть шесть текстовых полей с метками на них. каждая этикетка показывает дату, начиная с понедельника по субботу. Есть также кнопки для перехода к предыдущей и следующей неделям соответственно.
Я хочу иметь возможность выделять текущую дату КРАСНЫМ цветом каждый раз, когда я загружаю дату. Хотя мне удалось этого добиться, каждый раз, когда я нажимаю следующую/предыдущую кнопку, метка по-прежнему остается окрашенной. Например, если текущая дата — 29 ноября, четверг (выделено КРАСНЫМ), при нажатии на кнопку «Далее» на этой метке будет отображаться 06 декабря, четверг, но также выделено красным, что неверно, поскольку 6 декабря, четверг, не является текущей датой. Любые идеи, как я могу решить эту проблему? Вот мой код для изменения цвета метки. Спасибо

         if (label1.Text == DateTime.Now.ToString("dd MMMM dddd"))
            label1.ForeColor = Color.Red;
        else label1.ForeColor = Color.Black;

         if (label2.Text == DateTime.Now.ToString("dd MMMM dddd"))
             label2.ForeColor = Color.Red;
         else label2.ForeColor = Color.Black;

         if (label3.Text == DateTime.Now.ToString("dd MMMM dddd"))
             label3.BackColor = Color.Red;
         else label3.ForeColor = Color.Black;

         if (label4.Text == DateTime.Now.ToString("dd MMMM dddd"))
            label4.BackColor = Color.Red;
         else label4.ForeColor = Color.Black;

         if (label5.Text == DateTime.Now.ToString("dd MMMM dddd"))
            label5.BackColor = Color.Red;
         else label5.ForeColor = Color.Black;

         if (label6.Text == DateTime.Now.ToString("dd MMMM dddd"))
            label6.BackColor = Color.Red;
         else label6.ForeColor = Color.Black;

person Community    schedule 29.11.2012    source источник
comment
используйте отладчик, чтобы убедиться, что то, что вы думаете, происходит на самом деле. dotnetperls.com/debugging   -  person Sam I am says Reinstate Monica    schedule 29.11.2012
comment
это впф? почему вы не используете привязку?   -  person Arsen Mkrtchyan    schedule 29.11.2012
comment
@ArsenMkrt: в приложении формы Windows...   -  person Cᴏʀʏ    schedule 29.11.2012
comment
Просто ваш тест всегда возвращает true. Теперь вам просто нужно выяснить, почему, используя инструменты отладки. (Точка останова перед любым тестом и проверьте ваш labelX.text). Также, если вы используете свойство BackColor, текст не изменится.   -  person phadaphunk    schedule 29.11.2012
comment
@dhani: Почему ты смешиваешь BackColor и ForeColor? BackColor — это цвет фона TextBox, а ForeColor — цвет текста внутри TextBox. Вы должны только постоянно использовать один или другой.   -  person Cᴏʀʏ    schedule 29.11.2012
comment
Мне кажется, или ты не хотел, чтобы дд мммм дддд было больше похоже на дд мммм гггг ??   -  person CSharpie    schedule 29.11.2012
comment
@CSharpie нет, если ему нужен номер даты, полное название месяца, полное название дня и ему не нужен год. (Хотя вполне возможно, что вместо этого он хотел указать год)   -  person phadaphunk    schedule 29.11.2012
comment
@CSharpie Я не хотел год, просто хотел число, месяц и день недели   -  person    schedule 29.11.2012


Ответы (1)


Я думаю, проблема в том, что вы смешиваете настройки BackColor и ForeColor. Удалите дублированную логику и применяйте стиль таким же образом в одном месте. Создать методы

private void ApplyStyleTo(Label label)
{
    label.ForeColor = GetLabelForeColor(label.Text);
}

private Color GetLabelForeColor(string text)
{
    string todayText = DateTime.Now.ToString("dd MMMM dddd");
    return (text == todayText) ? Color.Red : Color.Black;
}

И примените стили ко всем меткам:

ApplyStyleTo(label1);
// ...
ApplyStyleTo(label6);

Кстати На самом деле я бы пошел дальше и создал собственную метку для отображения даты. Поместите эти метки на форму и установите их свойство Date следующим образом:

dateLabel1.Date = DateTime.Now;

Этикетка отформатирует и раскрасит дату. Вы сможете изменить формат даты и цвета.

public class DateLabel : Label
{
    private DateTime? _date;

    public DateLabel()
    {
        Format = "dd MMMM dddd";
        TodayForeColor = Color.Red;
    }

    public DateTime? Date
    {
        get { return _date; }
        set {
            _date = value;
            Text = _date.HasValue ? _date.Value.ToString(Format) : "";
            ForeColor = IsToday ? TodayForeColor : ForeColor;
        }
    }

    public bool IsToday
    {
        get  {
            if (!_date.HasValue)
                return false;    
            return _date.Value.Date == DateTime.Today;
        }
    }

    public string Format { get; set; }
    public Color TodayForeColor { get; set; }
}
person Sergey Berezovskiy    schedule 29.11.2012