C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: Controlプロパティ変化の捕捉


(過去ログ 135 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■79568 / inTopicNo.1)  Controlプロパティ変化の捕捉
  
□投稿者/ C#データ観測者 (1回)-(2016/04/14(Thu) 23:14:35)

分類:[C#] 

Windows7 Home C#4.0

今後のフォームアプリケーション開発の調査のために、
Controlを継承しているクラスのプロパティの値の変化を表示したいと考えています。

Timerコントロール、もしくはイベント等を使って、コントロールの値が変化したところを
コレクションに収めたいと思います。

private void Control_PropertyChange(object sender, EventArgs args )
{
    //List<string>にテキストを追加
    string Item = PropertyName + ":" + BeforeValue + "→" AfterValue
    listText.add(Item); //後でRichTextBoxで表示するために追加
}

こんなに都合のいいイベントはないかもしれませんが、このような動作に近い方法を探しています。
どなたかご存じないでしょうか。

引用返信 編集キー/
■79572 / inTopicNo.2)  Re[1]: Controlプロパティ変化の捕捉
□投稿者/ kiku (91回)-(2016/04/15(Fri) 09:48:32)
> Controlを継承しているクラスのプロパティの値の変化を表示したいと考えています。

・プロパティの実装に手を加えて良い場合
 手順1 プロパティのセッター内で値が変化したことを検出する。
 手順2 値の変化があったなら、カスタムイベントを発生させる。

・プロパティの実装に手を加えては駄目な場合
 別のタイミングでプロパティの変化を監視しなければならない。
 手順1 タイマーイベント内で、プロパティを監視し
     値の変化を検出する。
 手順2 値の変化があったなら、カスタムイベントを発生させる。

カスタムイベントの発生の仕方や作り方は下記を参照。
http://dobon.net/vb/dotnet/vb2cs/event.html

こんな感じの方向性では、どうでしょうか?
引用返信 編集キー/
■79573 / inTopicNo.3)  Re[2]: Controlプロパティ変化の捕捉
□投稿者/ PANG2 (116回)-(2016/04/15(Fri) 12:24:42)
重要なプロパティには、*Changedイベントが用意されている。
リフレクションで *Changedイベントを取り出してイベントハンドラを追加する。

public Form1()
{
	InitializeComponent();
	AddPropertyChangedEvent(this.textBox1);
}

private void AddPropertyChangedEvent(Control c)
{
	foreach (EventInfo e in c.GetType().GetEvents()) {
		if (e.Name.EndsWith("Changed")) {
			string name = e.Name.Substring(0, e.Name.Length - 7);
			PropertyChanged p = new PropertyChanged(c, name);
			e.AddEventHandler(c, new EventHandler(p.Changed));
		}
	}
}

public  class PropertyChanged
{
	public readonly Control c;
	public readonly string name;
	public object last_value;

	public PropertyChanged(Control c, string name)
	{
		this.c = c;
		this.name = name;
		this.last_value = value;
	}

	public object value
	{
		get
		{
			PropertyInfo p = c.GetType().GetProperty(name);
			return (p != null) ? p.GetValue(c, null) : null;
		}
	}

	public  void Changed(object sender, EventArgs e)
	{
		Debug.WriteLine(c.Name + "." + name + ":" + last_value + "→" + value);
		last_value = value;
	}
}

引用返信 編集キー/
■79589 / inTopicNo.4)  Re[3]: Controlプロパティ変化の捕捉
□投稿者/ C#データ観測者 (2回)-(2016/04/16(Sat) 18:40:31)
ありがとうございます。

実行した結果。
BindingContextとVisibleプロパティがDebug.WriteLineに入ってきました。
詳しく調べるために、Debug.WriteLineの部分を次のように改変して2つのオブジェクトを比較しました。

if (last_value != value)
{
//Debug.WriteLine(c.Name + "." + name + ":" + last_value + "→" + value);
MessageBox.Show(c.Name + "." + name + ":" + last_value + "→" + value);
}

そこでBindingContextは弾かれるのですが、Visibleは弾かれませんでした。
このままでは正確な比較ができないので、objectクラスを比較できる形に
キャストしたいのですが、どうすればよいでしょうか。


引用返信 編集キー/
■79590 / inTopicNo.5)  Re[4]: Controlプロパティ変化の捕捉
□投稿者/ Azulean (632回)-(2016/04/16(Sat) 19:08:41)
No79589 (C#データ観測者 さん) に返信
> そこでBindingContextは弾かれるのですが、Visibleは弾かれませんでした。
> このままでは正確な比較ができないので、objectクラスを比較できる形に
> キャストしたいのですが、どうすればよいでしょうか。

汎用的なコードとして == 演算子で比較することはほぼ無理と思います。
これはコンパイル時点の型で == 演算子は比較を行うため、リフレクションによる動的なコードと相性が悪いためです。

Equals メソッドを使うことでまだマシな結果になると思われます。
object.Equals メソッドをオーバーライドしている型であればその比較処理を呼び出すため。
ただし、すべての型がきちんと実装しているわけではないので、限界はあります。
引用返信 編集キー/
■79592 / inTopicNo.6)  Re[5]: Controlプロパティ変化の捕捉
□投稿者/ C#データ観測者 (4回)-(2016/04/16(Sat) 21:27:01)
object.Equalsで比較できそうです。
今のところ、不都合な状態はないのでこちらのソースを使用して様子を見たいと思います。


引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -