在Windows窗体.NET应用程序中调用g.DrawString()时出现System.ArgumentException

时间:2014-02-27 09:35:50

标签: c# .net winforms

我正在努力解决一个我似乎无法弄清楚的问题。

我有一个简单的Windows窗体应用程序,我在太阳系中显示行星及其中的一些信息。

但是,当我尝试绘制行星细节时,我得到以下异常:

A first chance exception of type 'System.ArgumentException' occurred in System.Drawing.dll
An unhandled exception of type 'System.ArgumentException' occurred in System.Drawing.dll
Additional information: Parameter is not valid.

这是我尝试绘图的方法:(在主窗体类中)

private void btnToggleInfo_Click(object sender, EventArgs e)
{
    showPlanetDetails = !showPlanetDetails;

    if (showPlanetDetails)
    {
        foreach (var planet in planets)
        {
            var font = new Font("Times New Roman", 12);
            var brush = new SolidBrush(Color.Black);
            g.DrawString(planet.ToString(), font, brush, planet.GetOccupiedScreenArea().Left, planet.GetOccupiedScreenArea().Bottom + 20);
        }
    }
}

以下是全班:http://pastebin.com/55XtaRgT 行星类:http://pastebin.com/iC7fgzqx

为什么应用程序失败的任何想法?错误消息的信息量不大。

编辑:结果发生错误,与drawString方法无关。我试着评论所有绘图,同样的事情发生了。

private void btnToggleInfo_Click(object sender, EventArgs e)
{
    showPlanetDetails = !showPlanetDetails;

    if (showPlanetDetails)
    {
        foreach (var planet in planets)
        {
            Console.WriteLine("Hello from planet");
            //var font = new Font("Times New Roman", 12);
            //var brush = new SolidBrush(Color.Black);
           // g.DrawString(planet.Name, font, brush, planet.GetOccupiedScreenArea().Left,
             //   planet.GetOccupiedScreenArea().Bottom + 20);
        }
    }
}

编辑2:当我点击“显示行星细节”按钮时,它也会因同样的错误崩溃: 这是唯一的代码:

private void btnToggleInfo_Click(object sender, EventArgs e)
{
    showPlanetDetails = !showPlanetDetails;

    if (showPlanetDetails)
    {
        Console.WriteLine("Button clicked");
    }
}

3 个答案:

答案 0 :(得分:0)

如果行星名称为空,则可能发生。

答案 1 :(得分:0)

然后你的列表行星中有一些值是全部,你可以测试这个方法

  foreach (var planet in planets.Where(planet => planet != null))
    {
        Console.WriteLine("Hello from planet");
        //var font = new Font("Times New Roman", 12);
        //var brush = new SolidBrush(Color.Black);
       // g.DrawString(planet.Name, font, brush, planet.GetOccupiedScreenArea().Left,
         //   planet.GetOccupiedScreenArea().Bottom + 20);
    }

答案 2 :(得分:0)

我终于开始工作了。将Graphics对象作为成员变量显然存在问题,并从我的方法中调用它。我反而最终做了:

var g = CreateGraphics();
g.drawString(...);

感谢您的帮助!