3

dotnet3.5とComponentFactoryKryptonv4.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コードであることに注意してください。私のクラスの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 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(Graphics 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

http://msdn.microsoft.com/en-us/library/windows/desktop/ms534175(v=vs.85).aspxに記載されているように、ステータスエラーはInvalidparameterです 。

残念ながら、これはGraphicsオブジェクトの問題を解決するのに役立ちません。これは、フィールドのユーザーからの未処理の例外が原因です。最近、EventHandlerのリークと、使用可能なすべてのGDIハンドルの消費が原因でメモリリークが発生しましたが、これを修正したので、これがメモリリークなのか、GDIハンドルリークなのか、それとも単に悪いのかわかりません。ユーザーが通常とは異なることを行うことによってトリガーされる場所を構成します。

誰かアイデアはありますか?よろしくお願いします!

4

4 に答える 4

7

私はちょうどこの問題に遭遇し、理解するのに数時間かかりました。コントロールからフォントへの参照を取得し、そのフォントでDispose()を実行するコードベースの他の部分まで追跡しました。これは、Windowsフォームプロジェクトを作成し、TreeViewとDataGridViewを追加して、TreeViewで実行することで再現できました。

treeView.Font.Dispose();

うまくいけば、私が見つけたものがこの問題に遭遇した人にとって役立つことを願っています。

于 2014-08-18T15:07:48.010 に答える
2

私はKrypton4.4と.NET4.0を使用していて、同じ動作を経験していましたが、KryptonComboBoxを処理しました。mataoのように、エラーは私のコードをまったく通過していないように見えましたが、Kryptonフレームワークと.NET自体を通過しているように見えました。

クリプトンのソースコードを調査し、このエラーがスローされたときのスタックトレースを調べた後、KryptonComboBox(またはクリプトンフレームワークの一部)がMicrosoft.Win32.SystemEvents.OnUserPreferenceChangedイベントにアタッチされていることに気付きました。 。おそらく、これが私のコードを通過しなかった理由は、このイベントが、ある時点でOSからトリガーされていたためです。エラーがスローされた理由はまだ説明されていませんが、私はこの問題について別の方法で考え始めました。

現在、このエラーが発生するたびに、常に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、コントロールパイプラインに接続されていないため、KryptonフレームワークにはKryptonCombBoxコントロールのパレットを更新しようとする際にいくつかの問題があります。

私が気付いた奇妙なニュアンスの1つは、Kryptonフレームワーク内で最初の例外がスローされた後、Graphicsオブジェクトが破損しているように見えることです。パレットを更新するための後続の呼び出し(クリプトンコントロールの色を切り替えるため)では、エラーは常にスローされますが、呼び出しスタックの別の領域を通過します(常にソースコード内のどこかから開始されます)。

マタオ、これがあなたの質問に答えるかどうかはわかりませんが、DataGridView内でコントロールを配線する方法に問題があると思います。おそらく、DataGridView内の何かでコントロールをTagプロパティに関連付けているのでしょうか。

これにより、問題に対する洞察が得られることを願っています。

* 編集 *

Mataoの質問によるKryptonComboBoxと、のTagプロパティにを追加していたコードを削除することで問題を修正しましたToolStripMenuItem。代わりに、必要な機能を取得するために、のプロパティにいくつかの追加ToolStripMenuItemsを追加しました。DropDownItemsmItem

コントロールパイプラインに追加されていない動的に作成されたコントロールについては、ソースコードを調べます。

于 2014-02-09T18:51:21.487 に答える
1

私にとっては、DefaultFontのDispose()が原因でした

于 2021-04-08T13:11:17.690 に答える
-2

DataGridビューを親レイアウトにドッキングしないでください

于 2020-06-02T08:11:49.420 に答える