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

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

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

Re[4]: C#でのFrom上のコントロール操作(初期)


(過去ログ 69 を表示中)

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

■40143 / inTopicNo.1)  C#でのFrom上のコントロール操作(初期)
  
□投稿者/ ななし (1回)-(2009/08/20(Thu) 17:17:52)

分類:[C#] 

はじめまして、最近になってVBのみしか扱えないという危機感に陥っているものですorz
今回基本的なDLL呼び出しやAPIコールの仕方などを復習してきたのですが、基本となるフォーム上のコントロールの操作
(TextBlock.Text)の変更がわかりません!
VBで同じようなプログラムを書くと簡単にプロパティ変更できるのですが、C#では例外が発生してしまいます。
|System.NullReferenceException はユーザー コードによってハンドルされませんでした。
|Message="オブジェクト参照がオブジェクト インスタンスに設定されていません。"
確かにデバック中に他のコントロールはSystemから呼び出されているのにTextBlockだけnullとなっています。

エラーとなるのは「TB_TextChanged」というイベントをフォーム上の2つのテキストボックス「TB_x,TB_y」がテキストチェンジで起こすことにしています。
その中でTextBlockのプロパティを変更しようとするとこのような例外が発生します。
TextBlockの代わりに違うコントロールを入れて見ても例外が起こるので、
コントロールやプロパティの呼び出しの方法ではなくC#のメソッドのルールに沿っていないのだとわかりました。

どのような方法でこの例外を回避するのかをご伝授ください。

コード
private void TB_TextChanged(object sender, TextChangedEventArgs e)
{
TextBox textbox = (TextBox)e.Source;
Accessor accessor = new Accessor();
string anther;
int add, mul;
if (TB_x != null && TB_y != null)//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
{
accessor.Test = textbox.Text;
if (TB_x.Text != "" && TB_y.Text != "")
{
//DLL
add = AddClass.Add(Convert.ToInt16(TB_x.Text), Convert.ToInt16(TB_y.Text));
mul = MultiplyClass.Multiply(Convert.ToInt16(TB_x.Text), Convert.ToInt16(TB_y.Text));

anther = ("P_key/Content=" + textbox.Text + "|" + textbox.Name + "\n" +
"コントロール" + textbox.Name + "Sin()=" + accessor.Test + "\n" +
"DLL:" + "ADD(TB_x,TB_y)" + Convert.ToString(add) + "\n" +
"DLL:" + "MUL(TB_x,TB_y)" + Convert.ToString(mul));

System.Diagnostics.Debug.Print("****************************************\n"+anther);
TB_A.Text = anther;//EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
}
}
}

このようなコードで//EEE…の部分でエラーが起きます。
代わりに「if (TB_A != null) { TB_A.Text = anther; }」ではエラーが起きない代わりにテキストボックスをマウスでクリックしてテキスト変更することができなくなりました。(タブキーでフォーカスを持って行っての変更は可能、動作が変更可能となったラベルっぽい)
そのためこのIF文「//@@@…」の使い方とプロパティ呼び出しの方法が間違っていると考えています。
なぜこのようになるか参考になるものでも結構です。
よろしくお願いします。
引用返信 編集キー/
■40150 / inTopicNo.2)  Re[1]: C#でのFrom上のコントロール操作(初期)
□投稿者/ まどか (618回)-(2009/08/20(Thu) 17:47:41)
TB_Aのインスタンスができていない状態(タイミング)でイベントが発生しているとか。
あとはイベントの関連付けからメソッドへの突入までの間にnullになるような記述があるとか。

ポイントはイベントの関連付けをしているタイミングでしょうか。

TB_Aがデザインされたものであるなら、Form.Loadイベントでブレークポイントを置き
止まるならどこかでnullにしている。
止まらずに例外になるならInitializeComponent()などのコントロールを作成している途中にイベントが発生している。
ということになりそうです。

引用返信 編集キー/
■40156 / inTopicNo.3)  Re[2]: C#でのFrom上のコントロール操作(初期)
□投稿者/ ななし (2回)-(2009/08/20(Thu) 19:13:07)
No40150 (まどか さん) に返信
お返事リガとうございます。
指摘させていただいた通りに検討してみると「Window_Loaded」でブレイクポイントを打っても何も反応しませんでした。
ファンクション8でデバック開始するとおっしゃる通り「InitializeComponent();」で「TB_TextChanged」が走って例外が発生していました。
実はTB_xも最初にnullが走ってしまうのでifで適当にスキップしていました・・・

ですが、これを「InitializeComponent();」を考慮して(InitializeComponent();でのみTB_TextChangedをスキップ)
するには直下にフォームデザイナが作成する「private void InitializeComponent()」を変更すればいいと書いてあるのですが
WPFには見当たりません。

TextChangedイベントを発生させるタイミングを制御するような方法があれば一番簡単で管理もしやすいのですが、書き直すとするとどのような方法があるのでしょうか?
またInitializeComponentを書き直すしか方法はないのでしょうか?
引用返信 編集キー/
■40178 / inTopicNo.4)  Re[3]: C#でのFrom上のコントロール操作(初期)
□投稿者/ まどか (619回)-(2009/08/20(Thu) 22:25:19)
No40156 (ななし さん) に返信
> WPFには見当たりません。

WPF。。。

WPFの細かい仕掛けは知らないのでイベントの関連付けの仕方がわかりません。

言えることは、InitializeComponentが、貼り付けてあるコントロールのインスタンスを作成する初期処理という一般の概念が変わらなければ
それより後で、つまり
フォームが表示される直前(Windows.Forms.FormならLoadイベント)
または
初回表示(同じくShownイベント)
に該当するところでイベントの関連付けをおこなうことになるでしょう。
#現在の問題は、前準備の段階でイベントが発生している(関連付けられている)ことです。

#すいませんがWPFの詳細は他の方にお任せします。。。

引用返信 編集キー/
■40196 / inTopicNo.5)  Re[4]: C#でのFrom上のコントロール操作(初期)
□投稿者/ ななし (3回)-(2009/08/21(Fri) 01:59:12)
No40178 (まどか さん) に返信
FormLoad時にイベントを作ってしまうなどいろいろやってみたのですが、
管理が難しくなるため結局TextChanged時に指定したコントロールが1つでもnullならスキップすることにしました。
デバッグでは指定したコントロール分余計にTextChangeが空回りしているので修正の余地があるのですが、
今の知識ではどうすることもできないのでこの方法で行きます。

ご指導ありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -