- PR -

C# MDI 子フォーム表示時の例外発生

1
投稿者投稿内容
噫無情
会議室デビュー日: 2008/10/07
投稿数: 3
投稿日時: 2008-10-07 14:55
はじめまして
お手数ですが、御教え願えないでしょうか。

[環境]
Microsoft Visual C# 2005 SP2

[ソースの作り]
MDIを利用して、子Formを呼び出す処理を作製しています。
(DropDownItemsのClickイベントで下記のソースの処理を行います)

[現象]
・子フォームを閉じたり、開いたりを行うと
f6.Show()の部分にて例外エラーが発生してしまいます。
発生頻度は不規則です。

[ソース引用?]
/*----------------------------*/
Form6 f6 = new Form6(this);
f6.MdiParent = this;
flg_form1_F6TRUE = true; ← 子フォームが呼び出された事を示すフラグ
f6.Show();
/*----------------------------*/

[エラ内容]
System.InvalidOperationException はハンドルされませんでした。
Message="オートフィル列がサイズ変更されるときに、この操作を実行することはできません。"
Source="System.Windows.Forms"

何所から調べれば良いのか良く分からない状態でして、
対策等ご教授頂けないでしょうか。
nakaP
大ベテラン
会議室デビュー日: 2005/09/27
投稿数: 138
お住まい・勤務地: 高知
投稿日時: 2008-10-07 15:15
まずは、ステップ実行してみましょう。
エラーの内容から推測するとMDI子Formは関係なさそうです。

MDI子Formを開くときにどのような処理をしているか、その辺を調査してみてください。
噫無情
会議室デビュー日: 2008/10/07
投稿数: 3
投稿日時: 2008-10-08 17:30
ご返信ありがとう御座います。

発生頻度が低いために、ステップ実行で捕らえる事が困難でして、
少し困っています。
現状、出来る事からやってみました。

MDI子Formを開くときにどのような処理をしているか
Form6 f6 = new Form6(this); 周辺の処理を重点的に調べるという意味で、
form6のイベント処理等が悪さしている可能性を考えて、「Debug.Print」
を使って処理が、こけた部分箇所をさがしてみました。

Form6-InitializeComponent();
以降の処理に特に意図していないイベント等は発生していませんでした。
何所が悪いのかまだ特定できていません。
(呼び出し履歴も調べてみましたが、正常時と異常時に違いは有りませんでした。)

このような際に、有効なデバッグの方法はありますでしょうか。
非常に素人な質問だとは思いますが、よろしく御願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-10-08 18:32
引用:

噫無情さんの書き込み (2008-10-08 17:30) より:

このような際に、有効なデバッグの方法はありますでしょうか。


確実なのはログ収集。 例外が発生しているなら発生場所くらいわかりそうですが。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-10-08 19:50
引用:

噫無情さんの書き込み (2008-10-08 17:30) より:
このような際に、有効なデバッグの方法はありますでしょうか。


例外が発生したときのスタックトレースは得られないのでしょうか?もし得られるのならばそれを提示されたほうが良いと思います。

引用:

噫無情さんの書き込み (2008-10-07 14:55) より:
[エラ内容]
System.InvalidOperationException はハンドルされませんでした。
Message="オートフィル列がサイズ変更されるときに、この操作を実行することはできません。"
Source="System.Windows.Forms"


以下、あてずっぽうな推理になりますが、InvalidOperationException が出ていることから考えて、フォームに貼ったコンポーネントが出しているような気もします。Show はそのきっかけにすぎず、例外がどこで起きているかはスタックトレースを見ないと分からないように思います。
エラーメッセージにある「オートフィル列」とはなんのことなんでしょうね。グリッド系のコンポーネントかなにかですか?
nakaP
大ベテラン
会議室デビュー日: 2005/09/27
投稿数: 138
お住まい・勤務地: 高知
投稿日時: 2008-10-08 23:30
まずは訂正を。
引用:

エラーの内容から推測するとMDI子Formを開くこと自体は関係なさそうです。


でした。

引用:

Message="オートフィル列がサイズ変更されるときに、この操作を実行することはできません。"


ここより、DataGridViewなどが出力しているエラーかなと判断しました。

引用:

例外が発生したときのスタックトレースは得られないのでしょうか?もし得られるのならばそれを提示されたほうが良いと思います。


ですね。

予想ですが、DataTableなどをBindしているコントロール辺りがあやしいのかなと思います。
だとすると、特定のデータを呼び出したときに発生しているのかな、と。
噫無情
会議室デビュー日: 2008/10/07
投稿数: 3
投稿日時: 2008-10-20 10:17
お世話になっております。

すいませんがもう少し御教え願えないでしょうか。

引用:

スタックトレースは得られないのでしょうか?もし得られるのならばそれを提示されたほうが良いと思います。



すいません。スタックトレースをどうやって使うかがよく分かりません。
「StackTrace クラス」を見よう見まねで使ってみたのですが、
正確な情報をつかむ事が出来ません。

例:
try
{
f6.Show();
}
catch
{
StackTrace st = new StackTrace(true);
string stackIndent = "";
for (int i = 0; i < st.FrameCount; i++)
{
// Note that high up the call stack, there is only
// one stack frame.
StackFrame sf = st.GetFrame(i);       ←line306
Console.WriteLine();
Console.WriteLine(stackIndent + " Method: {0}",
sf.GetMethod());
Console.WriteLine(stackIndent + " File: {0}",
sf.GetFileName());
Console.WriteLine(stackIndent + " Line Number: {0}",
sf.GetFileLineNumber());
stackIndent += " ";
}

出力結果
Method: Void F6_Show_processing()
File: E:\Sample1\Form1.cs
Line Number: 306

引用:

DataTableなどをBindしているコントロール辺りがあやしいのかなと思います。
だとすると、特定のデータを呼び出したときに発生している


貴重なご意見ありがとう御座います。
ユーザー入力ようのDGV呼び出しですので、特定のデータを呼び出しているようには
思えないのが現状です。
また、例外の発生頻度も低いため(同じ事をしているのに)非常に悩んでいます。
nakaP
大ベテラン
会議室デビュー日: 2005/09/27
投稿数: 138
お住まい・勤務地: 高知
投稿日時: 2008-10-20 11:18
うーん、何かあえて難しくしているような。

私もこの辺あまり詳しくないのですが、Exception.StackTraceプロパティでよいのでは。
試したところ、エラーの発生元はすぐに特定できました。
1

スキルアップ/キャリアアップ(JOB@IT)