所以我得到了这段代码。 (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++;
}
答案 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,而不是断点。
但是这里有一些可能性:
<强>更新强> 为了回应你的编辑:
你的问题是,earliestDate会继续前进,因为你在Paint事件中修改它并且值将在Paint事件之间保持不变。每次控件失效时都会重复出现绘制事件。你有两个选择。
我建议选项1。
答案 2 :(得分:0)
DateTime不是一个准确的测量,但消息框的延迟有助于 改为使用.NET的PreformanceCounter(测量从进入循环之前经过的时间)。