社内の WinForms アプリの 1 つにあるハンドルされていない例外ハンドラーは、このエラーと、本番環境での使用による同じバリエーションを定期的に報告しています (ハンドルされていない例外が発生するたびに電子メールで送信するように構成されています)。ただし、これは再現性がなく、すべて XP SP3 であるさまざまなユーザーのマシンでランダムな間隔で発生します。
これは、データグリッドのマスクされたテキスト ボックスに関連しているように見えますが、多くの画面にある数十のコントロールのうち、同じ 3 つのコントロールにのみ表示されるようです。これらのコントロールには、フォントが指定されていません。
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(DataridViewCellStyle dataGridViewCellStyle)
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)
本当に困惑したのは、スタック トレースが完全に System 名前空間内にあるということです。そのため、フォントに何か問題がありますが、それが何であるかはわかりません。「パラメーターが無効です」は、パラメーターの何が無効であるかについて多くの情報を提供しません (これは、基になる GDI ライブラリからのものです)。
また、クラスの 1 つを通過する同様の例外が発生するため、エラーをトラップすることができました。
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 MyApp.MaskedTextBoxEditingControl.ApplyCellStyleToEditingControl(DataGridViewCellStyle
dataGridViewCellStyle)
問題のコードは次のとおりです。
public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle){
this.Font = dataGridViewCellStyle.Font;
// set other things
}
その行を try/catch ブロックでラップし、渡されたフォントで ToString() を呼び出し、次の結果を取得しました。 False]」なので、何が起こっているのかわかりません。何か案は?