графика не рисуется, когда условие цикла является датой. c #, winForms - PullRequest
1 голос
/ 31 марта 2010

так что я получил этот кусок кода. (currPosX определен ранее)

while (earliestDate < DateTime.Today)
        {
            currPosX = currPosX + 5;
            e.Graphics.DrawLine(Pens.Black, currPosX, 0, currPosX, 10);

            earliestDate = earliestDate.AddDays(1);
        }

графика не рисует. это действительно странно, так как это происходит только тогда, когда оператор условия является сравнением даты. Я отладил, и он идет в цикле, и значения путаются с (например, currPosX). Но нет отображения. еще одна странность, если я добавлю MessageBox.Show ("blabla") в цикл, появится окно сообщения и будет нарисована графика. что здесь происходит?

РЕДАКТИРОВАТЬ: просто чтобы напомнить вам, ребята, когда это не время, это работает. Это означает, что этот код работает. он отображает серию строк

int i = 0;

        while(i < 10)
        {
            currPosX = currPosX + 5;
            e.Graphics.DrawLine(Pens.Black, currPosX, 0, currPosX, 10);
            i++;
        }

Ответы [ 3 ]

3 голосов
/ 31 марта 2010

Я сделал простой тестовый проект, у которого просто есть форма без элементов управления (код ниже). Как вы можете видеть, я добавил небольшой код в конструктор для инициализации самых ранних данных, чтобы цикл while в событии Paint выполнялся один раз. Также жестко закодировано значение currPos.

Если вы запустите это, он будет рисовать вертикальную линию, как и ожидалось. Но если вы сделаете что-либо, что сделает недействительной графику (например, сверните и восстановите форму), она не будет перерисовывать графику. Таким образом, он рисует его один раз, но не будет рисовать снова в течение 24 часов!

public partial class Form1 : Form
{
    DateTime earliestDate;
    public Form1()
    {
        earliestDate = DateTime.Now;
        earliestDate = earliestDate.AddDays(-1);
        InitializeComponent();
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        while (earliestDate < DateTime.Today)
        {
            float currPosX = 0;
            currPosX = currPosX + 5;
            e.Graphics.DrawLine(Pens.Black, currPosX, 0, currPosX + 5, 10);

            earliestDate = earliestDate.AddDays(1);
        } 
    }
}
2 голосов
/ 31 марта 2010

Как показывают ваши тесты, проблема не имеет ничего общего со сравнением DateTime. Поскольку ваш код входит в цикл, и вы знаете, что рисование выполняется, должно быть что-то еще. Возможно, нам понадобится больше кода, чтобы определить проблему

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

Но вот некоторые возможности:

  • Вы уверены, что ваши координаты находятся в видимой клиентской области элемента управления?
  • Вы делаете вышеупомянутое в событии Paint элемента управления?
  • Не забыли ли вы сделать недействительным элемент управления, используя метод Invalidate или Refresh?
  • Вы рисуете в пользовательском интерфейсе?
  • У вас есть нестандартные стили управления?

UPDATE В ответ на ваше изменение:

Ваша проблема в том, что earliestDate будет продолжать двигаться вперед, потому что вы изменяете его в событии Paint, и значение сохраняется в промежутке между событиями Paint. События рисования происходят повторно каждый раз, когда элемент управления становится недействительным. У вас есть два варианта.

  1. Скопируйте earliestDate в локальную переменную в событии Paint и используйте это
  2. Сбросьте earliestDate к его начальному значению в конце события.

Я предлагаю вариант 1.

0 голосов
/ 31 марта 2010

DateTime не является точным измерением, хотя задержка окна сообщения помогает.
Вместо этого используйте PreformanceCounter .NET (измерьте время, прошедшее с начала цикла).

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