来自Font.GetHeight的Windows窗体“System.ArgumentException:Parameter is not valid”(图形图形)

时间:2013-03-27 05:59:13

标签: .net winforms gdi+ argumentexception

我正在使用dotnet 3.5和ComponentFactory Krypton v4.4.0.0支持winforms应用程序,我最近实现了AppDomain.CurrentDomain.UnhandledException和Application.ThreadException处理程序,以通知我客户端发生的异常,并发现很多日志中显示的错误。这个人现在正在努力:

System.ArgumentException: Parameter is not valid.
 at System.Drawing.Font.GetHeight(Graphics graphics)
 at System.Drawing.Font.GetHeight()
 at System.Drawing.Font.get_Height()
 at System.Windows.Forms.Control.set_Font(Font value)
 at System.Windows.Forms.DataGridViewComboBoxEditingControl.ApplyCellStyleToEditingControl(DataGridViewCellStyledataGridViewCellStyle)
 at System.Windows.Forms.DataGridView.BeginEditInternal(Boolean selectAll)
 at System.Windows.Forms.DataGridView.ProcessKeyEventArgs(Message& m)
 at System.Windows.Forms.Control.ProcessKeyMessage(Message& m)
 at System.Windows.Forms.Control.WmKeyChar(Message& m)
 at System.Windows.Forms.Control.WndProc(Message& m)
 at System.Windows.Forms.DataGridView.WndProc(Message& m)
 at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
 at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
 at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam,IntPtr lparam)

请注意,堆栈跟踪完全在Windows代码中。还有一个通过我的课程之一:

System.ArgumentException: Parameter is not valid.
  at System.Drawing.Font.GetHeight(Graphics graphics)
  at System.Drawing.Font.GetHeight()
  at System.Drawing.Font.get_Height()
  at System.Windows.Forms.Control.set_Font(Font value)
  at MyOrg.MyApp.WindowsClient.GuiControls.MaskedTextBoxEditingControl.ApplyCellStyleToEditingControl(DataGridViewCellStyledataGridViewCellStyle)
  at System.Windows.Forms.DataGridView.BeginEditInternal(Boolean selectAll)
  at System.Windows.Forms.DataGridView.ProcessKeyEventArgs(Message& m)
  at System.Windows.Forms.Control.ProcessKeyMessage(Message& m)
  at System.Windows.Forms.Control.WmKeyChar(Message& m)
  at System.Windows.Forms.Control.WndProc(Message& m)
  at System.Windows.Forms.DataGridView.WndProc(Message& m)
  at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
  at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
  at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

以下是该代码段的代码:

public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
{
  this.Font = dataGridViewCellStyle.Font;
  this.ForeColor = dataGridViewCellStyle.ForeColor;
  this.BackColor = dataGridViewCellStyle.BackColor;
  this.TextAlign = translateAlignment(dataGridViewCellStyle.Alignment);
}

这对我来说并不多。

“System.ArgumentException:参数无效”。错误是非常可悲的,让我很少继续,但使用dotPeek我看了Font.Get_Height(图形g)的代码并发现它是一个GDI +错误,特别是GetFontHeight:

public float GetHeight(Graphics graphics)
{
  if (graphics == null)
  {
    throw new ArgumentNullException("graphics");
  }
  else
  {
    float size;
    int fontHeight = SafeNativeMethods.Gdip.GdipGetFontHeight(new HandleRef((object) this, this.NativeFont), new HandleRef((object) graphics, graphics.NativeGraphics), out size);
    if (fontHeight != 0)
      throw SafeNativeMethods.Gdip.StatusException(fontHeight);
    else
      return size;
  }
}

这是GDI +方法: http://www.jose.it-berater.org/gdiplus/reference/flatapi/font/gdipgetfontheight.htm

我的状态错误是Invalidparameter,如下所示: http://msdn.microsoft.com/en-us/library/windows/desktop/ms534175(v=vs.85).aspx

不幸的是,这些都没有帮助我解决Graphics对象的问题。这来自该领域用户的未处理异常。我最近有一个由泄漏的EventHandler引起的内存泄漏,并且消耗了所有可用的GDI句柄,但是我已经解决了这个问题,所以现在我不确定这是内存泄漏,GDI句柄泄漏,还是只是坏了配置由用户做一些与众不同的事情触发的地方。

谁有任何想法?非常感谢!

4 个答案:

答案 0 :(得分:5)

我刚刚遇到这个问题并花了几个小时才搞清楚,我将其追溯到代码库的其他部分,从控件中获取对Font的引用,然后对其执行Dispose()字体。我能够通过创建Windows窗体项目,添加TreeView和DataGridView并在TreeView上执行它来重现这一点

treeView.Font.Dispose();

希望我发现的内容对遇到此问题的任何人都有帮助。

答案 1 :(得分:2)

我正在使用Krypton 4.4和.NET 4.0并且遇到了相同的行为,但它处理的是KryptonComboBox。像matao一样,错误似乎根本不是通过我的代码,而是通过Krypton框架和.NET本身。

在对Krypton源代码进行一些调查并查看抛出此错误后的堆栈跟踪后,我注意到KryptonComboBox(或Krypton框架的一部分)附加到Microsoft.Win32.SystemEvents.OnUserPreferenceChanged事件中。让我思考。也许这不是通过我的代码的原因是这个事件是在某个时候从操作系统触发的。它仍然没有解释为什么错误被抛出,但我开始以不同的方式思考这个问题。

现在,每当发生此错误时,它总是遍历KryptonComboBox,但它在任何方面都不一致。实际上很难调用。但是,由于OnUserPreferenceChanged事件触发,我开始查看全局策略更改或触发该事件的内容。通过一些运气,我注意到如果我运行WinForms应用程序并启动Internet Explorer,我可以可靠地弹出这个异常。不要问我为什么会这样,但显然启动IE会以某种方式触发OnUserPreferenceChanged事件。

现在我有一种可靠的方法来触发异常,我开始在我的代码中查看KryptonComboBox实例并注释掉整个模块,看看我是否可以让这个异常回来。最终,我发现了错误,结果是我的WinForms应用程序中的代码被连线的错误。具体来说,这是错误:

    KryptonComboBox detailView = new KryptonComboBox();
    detailView.Sorted = true;
    detailView.Text = "View";
    detailView.Items.Add(new KryptonListItem("Details", "Detail View"));
    detailView.Items.Add(new KryptonListItem("List", "List"));
    detailView.Items.Add(new KryptonListItem("Tile", "Tiles"));

    ToolStripMenuItem mItem = new ToolStripMenuItem();
    mItem.Tag = detailView;
    mItem.Text = detailView.Text;
    mItem.Click += new EventHandler(contextItem_Click);

我的猜测是因为detailView没有连接到Control管道,Krypton框架在尝试更新KryptonCombBox控件的Palette时遇到了一些问题。

我注意到的一个奇怪的细微差别是,在Krypton框架内抛出第一个异常后,它似乎破坏了Graphics对象。后续调用更新Palette(切换Krypton控件的颜色),错误总是会抛出但是通过调用堆栈中的不同区域(始终从我的源代码中的某个位置启动)。

Matao,我不确定这会回答你的问题,但我相信你可能在如何在DataGridView中连接你的控件时遇到一些问题。也许您正在将控件与Tag属性关联到DataGridView中的某些内容?

我希望这可以帮助您深入了解您的问题。

*编辑*

根据Matao的问题,我通过删除将KryptonComboBox添加到ToolStripMenuItem的Tag属性的代码来解决问题。相反,为了获得我想要的功能,我只是在ToolStripMenuItems的{​​{1}}属性中添加了一些DropDownItems

我会查看未添加到Control管道的任何动态创建的控件的源代码。

答案 2 :(得分:1)

对我来说是因为 DefaultFont 的 Dispose()

答案 3 :(得分:-2)

不要将DataGrid视图停靠在父布局上