🌴

どこで値が変更されているか調査する

2 min read

はじめに

どこかでControlのプロパティや変数が変更されてるけど、どこで変更されているか分からん!ってときに使えるテクニック。

やりかた概要

調査したいプロパティや変数を持つクラスを継承して、対象のプロパティや変数をOverrideする。
それからそこにブレークポイントを設定して、呼び出し履歴ウインドウで呼び出し個所を確認していく。

やりかた詳細

今回はFormに貼り付けてあるボタンとかテキストボックスを対象に説明します。

調査したいコントロールをDesignerファイルから探す

まず、デザイナーから調査したいコントロールのNameプロパティをコピーして、次にDesignerファイルを開いてコントロールを宣言しているところを検索する。
それから、開いたDesignerファイル内をコピーした文字列で検索する。
DesignerファイルはFormの中に入っております。

Designerファイルがない場合はソリューションエクスプローラーの上のほうにあるすべてのファイルを表示アイコンをクリックする

コントロールの型を変更して、新しい型を作成する

検索に引っかかってきたコントロールの型を適当な名前に変更する。型は2か所あるので両方変更する。
以下の例だとTextbox型をfoo型に変更した。

private void InitializeComponent()
{
- this.textBox1 = new System.Windows.Forms.TextBox();
+ this.textBox1 = new foo();
  ~~~ 省略 ~~~
}
- private System.Windows.Forms.TextBox textBox1;
+ private foo textBox1;

次に、変更した型を作成する。
コンパイルエラーが出ている個所でctrl + .を押してクラス作成すると楽。
作成したあとはfooの位置でF12を押せばfooクラスへジャンプできます。

親クラスを変更して、確認したいプロパティ等をオーバーライドする

今回の例だとfooの親クラスをSystem.Windows.Forms.TextBoxに変更する。

- class foo
+ class foo : System.Windows.Forms.TextBox
{

あとは対象プロパティ等をオーバーライドして、そこにブレークポイントはる。
今回の例では、BackColorプロパティを使っています。
TextboxのBackColorをオーバーライドして、変更された場合は色を出力ウインドウへ表示するようにしてみました。

+ public override Color BackColor
+ {
+     get { 
+             return base.BackColor;
+         }
+     set { 
+             base.BackColor = value; 
+             System.Diagnostics.Debug.Print(base.BackColor.ToString()); 
+         }
+}

ブレークした個所で呼び出し履歴を見る

呼び出し履歴ウインドウを見るとどこで呼び出されたかが確認できる。
これはメニューバーのデバッグ(D) → ウインドウ(W) → 呼び出し履歴(C)で表示できます。

デバッグ実行中でないと表示されないので注意!

中身はこんな感じ。
行をダブルクリックするとその場所に移動できます。