- - PR -
InitializeComponent 内に自動生成されるコントロールの順序について
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-01-11 10:13
順序が変更されては困る部分を、InitializeComponent() の外に出す
実装をしてはいかがですか? _________________ IEEE-CSDP 2004-2007 | ||||||||||||
|
投稿日時: 2005-01-11 11:12
ありがとうございます。 データ連結後のグリッドの列の見栄え(デザイン)をデザイナ上で行いたい(標準でスキーマ読み書きしている模様)と思ってます。 InitializeComponentの外に出すと、コーディング量が増え、かつ保守性(効率性)が下がるんで・・・ <DebuggerStepThrough> を外してステップ実行してみたら、ISupportInitialize.BeginInit 〜 ISupportInitialize.EndInit に囲まれているにも関わらず、FlexGrid の DataSource に DataSet への参照をセットした時点で、FlexGrid が DataSet に対して Fill を要求しているのが分かりました。 私の認識では、正しくインプリメントされたコントロールであれば、ISupportInitialize.BeginInit 〜 ISupportInitialize.EndInit の間ではイベントを発生させない(ISupportInitialize.EndInitが呼ばれた時点で処理する)という風であるべき、だと思ってたんですが、そもそもその認識が間違ってますでしょうか? (コントロールがベストな状態にインプリメントされていないだけ?) <System.Diagnostics.・・・> のような、ソースコードに埋め込んでコントロールの初期化順序を制御を IDE に対して指定することができればなぁと思ってたんですが。 予断ですが、この辺でデバッグ&検証作業をしていると、自前でコントロールを作る際に留意しておくべきことが分かってきますね。 | ||||||||||||
|
投稿日時: 2005-01-11 11:56
DataSetの生成部分を、コンストラクタ内のInitializeComponent()の前に出せばよいと思います。 クラス化すれば保守性も向上! なお、コントロールのところはInitializeComponentの外に出す必要はないですが... | ||||||||||||
|
投稿日時: 2005-01-11 21:41
中さんのコメントは『コンストラクタで変なことしてるからそんなことになるんですよね? 』ですよね。このコードはコンストラクタではなく、『IDE が自動生成したコード』ですよね。・・・あ、『ISupportInitialize.BeginInit 〜 ISupportInitialize.EndInit の間ではイベントを発生させない(ISupportInitialize.EndInitが呼ばれた時点で処理する)という風であるべき』(2005-01-11 11:12)につながるのか。 最初に読んだときから疑問なのですが。。。
FormBはFormAを継承しているんですよね。ここで「コントロール初期化の順番が変わる」のは、FormB.InitializeComponentメソッドでしょうか?それともFormA.InitializeComponentメソッドでしょうか?私的には、FormB.InitializeComponentメソッドに、FormA上にあるコントロールの初期化がコーディングされるというのが納得できないのですが。ちなみに、手元のプロジェクトでForm1を継承してForm2を作成しましたが、Form2のInitializeComponentメソッドの中は
だけです。Form2、Form1の継承先では、Form1上のコントロールのプロパティを変更するコード、オブジェクトを生成するコードは記述されていません。 FormAのInitializeComponentはFormAのコンストラクタから呼び出されますが、それはFormBのコンストラクタから、FormBのコンストラクタ実行前に呼び出されます。FormAのコントロールをProtectedアクセスに宣言したとしても、作成はFormBコンストラクタの実行前に実行されています。また、コントロールの生成はFormA上で行われます。そうでなければ、FormBからアクセスできません。プロパティの変更はできても、コントロールの作成をFormB.InitializeComponentメソッドで行うのはおかしいと思いますし、そういうコードがFormB.InitializeComponentメソッドに書かれることはないと思います。アクセス権の設定やバインドのさせ方などを含めて、『コンストラクタで変なことしてる』のではないでしょうか。 まず、FormAで宣言しているコントロールとそのアクセス権、FormBで宣言しているコントロールおよびそのコントロールとFormAで宣言されているコントロールとの関係を洗い直す必要があるのではないでしょうか。 そして、これまでに書かれている内容からは、「FormA上に配置したコントロールが、FormB上でオブジェクト化され、その順番が何かの拍子に入れ替わる」という問題であると理解しています。 もし、問題となっているコードがFormB独自のものであるなら、「FormAを継承している」というのが問題に関係しているのか、切り分ける必要があると思います。 _________________ | ||||||||||||
|
投稿日時: 2005-01-13 10:19
色々とありがとうございました。 継承していないコントロールでも、コントロール連携で不穏な動作を発見しました。 コントロール間の依存関係をうまく処理せずに IDE がコード生成しているせいなのか、はたまたコード生成順序に依存してしまっているコントロールの作りが悪いのか、判りませんが。。。 時間ができたら、ユーザーコントロールでラップして、変な手間(IDEが生成したコーディングの順序を入れ替える)が発生しないようにしたいなぁとは思ってます。 ところで、BeginInit〜EndInitで括ってるにも拘らず「コード生成順序に依存してしまっている」というのは、仕様なんでしょうかね?それともバグなんでしょうかね? 再現手順が明確になれば、コントロールの製造元にサポート依頼いるんですが。。 |