2010-03-31 23 views
1

所以我得到了这段代码。 (currPosX定义较早)当循环条件为日期时,图形不绘制。 c#,winForms

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++; 
     } 

回答

2

正如您的测试所表明的,这个问题与比较DateTime无关。由于您的代码正在进入循环,并且您知道绘画正在完成,所以还有其他事情正在进行。我们可能需要看到更多的代码来识别问题

试图通过绘画代码是没用的。调试器和应用程序窗口贸易焦点将完全搞砸了。你最好用tracepoints,而不是断点。

但这里有一些可能性:

  • 你确定你的坐标是在控制的可视工作区?
  • 你是否在控件的Paint事件中执行上述操作?
  • 您是否记得使用Invalidate或Refresh方法使控件失效?
  • 你在UI线程上绘画吗?
  • 您是否有任何非标准控制样式集?

UPDATE 在回答您的编辑:

您的问题是earliestDate将继续匍匐前进,因为你在你的Paint事件修改它,价值会画图事件之间依然存在。每当控件失效时,Paint事件都会重复发生。你有两个选择。

  1. 复印earliestDate在Paint事件的局部变量,并使用该
  2. 在事件结束时重置earliestDate回到其起始数值。

我建议选择1

+0

是,可见区域。是的,在Paint事件中。无效或刷新不起作用,没有任何反应。我不知道UI线程是什么。我不知道控制风格是什么。检查我的编辑 – jello 2010-03-31 04:03:31

+0

我更新了我的答案以回应您的编辑。 – Josh 2010-03-31 06:05:48

+0

我用你的#1解决方案,它的工作原理。 thx – jello 2010-03-31 19:11:29

0

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

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); 
     } 
    } 
} 
+0

+1精彩!这听起来像是这个问题。 – 2010-03-31 04:08:23

+0

thx,但是你的代码对我不好,因为我有2个面板。顶部面板上有一个滚动条,当您滚动它时,底部面板(包含图形)必须遵循。所以,除非我错了,否则每次滚动顶部面板时都需要重新绘制控件 – jello 2010-03-31 19:14:24

+0

您是对的,您需要每次都重新绘制。这段代码并不是为了解决这个问题 - 它只是显示了一个测试,确认你不能跳过重绘。 – 2010-03-31 19:27:59