当循环条件是日期时,图形不会绘制。 c#,winForms

时间:2010-03-31 03:11:40

标签: c# winforms graphics

所以我得到了这段代码。 (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 个答案:

答案 0 :(得分:3)

我做了一个简单的测试项目,它只有一个没有控件的表单(代码如下)。正如您所看到的,我在构造函数中添加了一些代码来初始化最早的数据,以便Paint事件中的while循环将执行一次。还对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);
        } 
    }
}

答案 1 :(得分:2)

正如您的测试所示,该问题与比较DateTime无关。由于您的代码正在进入循环,并且您知道绘画正在完成,因此必须继续进行其他操作。我们可能需要查看更多代码来识别问题

尝试逐步绘制代码是没用的。调试器和应用程序窗口交易焦点的事实将完全搞砸了。你最好使用tracepoints,而不是断点。

但是这里有一些可能性:

  • 您确定您的坐标位于控件的可见客户区吗?
  • 您是在控件的Paint事件中执行上述操作吗?
  • 您是否记得使用Invalidate或Refresh方法使控件无效?
  • 你是在UI线程上绘画吗?
  • 您是否设置了任何非标准控件样式?

<强>更新 为了回应你的编辑:

你的问题是,earliestDate会继续前进,因为你在Paint事件中修改它并且值将在Paint事件之间保持不变。每次控件失效时都会重复出现绘制事件。你有两个选择。

  1. 将earliestDate复制到Paint事件中的局部变量并使用
  2. 将earliestDate重置为事件结束时的起始值。
  3. 我建议选项1。

答案 2 :(得分:0)

DateTime不是一个准确的测量,但消息框的延迟有助于 改为使用.NET的PreformanceCounter(测量从进入循环之前经过的时间)。