- PR -

InitializeComponent 内に自動生成されるコントロールの順序について

投稿者投稿内容
こばさん
大ベテラン
会議室デビュー日: 2004/03/17
投稿数: 147
投稿日時: 2005-01-09 10:53
 VB.NET 2003 を利用しています。
 InitializeComponent 内に自動生成されるコントロールの順序について、疑問があり投稿させて頂きます。

 FormA に幾つかのコントロールがあり、IDE が生成したコードが InitializeComponent に自動的に記述されています。
 その中で使っているコントロールの仕様で、ControlA → ControlB の順序で初期化しないといけないものがあり、正しい順序でコーディングされていることを確認しています。

 この FormA を継承して FormB を作りました。
 FormB を色々といじっていると、InitializeComponent 内でコントロールの初期化するところの順序が変わってしまいます。
 InitializeComponent 内のコードが、ControlB → ControlA の順序に変わってしまうのです。
 
 継承元である FormA は ControlA → ControlB の順序のままです。

 IDE が自動生成するコードで、コントロールの初期化の順序はどのようにして決まっているのでしょうか?
 それとも、初期化の順序に依存しないようなコントロールであるべきなんでしょうか?
中博俊
ベテラン
会議室デビュー日: 2004/10/17
投稿数: 91
お住まい・勤務地: 大阪市
投稿日時: 2005-01-09 11:12
コンストラクタで変なことしてるからそんなことになるんですよね?
初期化はForm_Loadから呼ぶことを念頭に、順番に影響されないつくりにしましょう。
こばさん
大ベテラン
会議室デビュー日: 2004/03/17
投稿数: 147
投稿日時: 2005-01-09 13:30
>コンストラクタで変なことしてるからそんなことになるんですよね?

 やはりですか。。
 私もソースが見てみたいです。

 順序依存のコントロールとは、某社の DataObject for .NET と、それに連携できるコントロールたちです。。。
菊池
会議室デビュー日: 2004/11/15
投稿数: 19
投稿日時: 2005-01-09 15:17
初期化に関わる生成順序とプロパティの設定順序等は別物ですけど、どっちの話でしょうか

プロパティで設定されるのであればAに必要なBが後から生成されても別段として問題は無いはずです。

A a = new A();
B b = new B(); // 生成はBが後
a.x = b;

Aに設定される時点でBが何かの状態になければならないという制約がないように
コントロールやコンポーネントは設計するべき&VS.NETは制約が無いと思っている
ということだと思います。

>順序依存のコントロールとは、某社の DataObject for .NET と、それに連携できるコントロールたちです。。。

 使い物になるものから使い物にならないものまで多様なものが市場には流れます
ので、使い物にならないものを握らないように有る程度評価をしてから導入する
のが正しいでしょう。
 導入を決めた以上は愚痴ってもしょうがない事です。
こばさん
大ベテラン
会議室デビュー日: 2004/03/17
投稿数: 147
投稿日時: 2005-01-09 18:11
>初期化に関わる生成順序とプロパティの設定順序等は別物ですけど、どっちの話でしょうか

 プロパティの設定順序です。


>使い物になるものから使い物にならないものまで多様なものが市場には流れます
>ので、使い物にならないものを握らないように有る程度評価をしてから導入する
>のが正しいでしょう。
>導入を決めた以上は愚痴ってもしょうがない事です。

 ええ、VB2の時代から何度も苦汁を味わってます。
 ひとまず継承さえしなければ不具合が起きなかったので油断しました。

 今回の件は、コードレベルで順序を入れ替えれば回復するので、それで回避してます。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-01-09 20:55
引用:
私もソースが見てみたいです。

.NETで作られたライブラリならReflector for .NETでコードが見れることがあります。
http://www.atmarkit.co.jp/fdotnet/tools/dotfuscator/dotfuscator_02.html
見てよいのかはわかりませんが。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-01-10 18:27
引用:

こばさんさんの書き込み (2005-01-09 13:30) より:
>コンストラクタで変なことしてるからそんなことになるんですよね?

 やはりですか。。
 私もソースが見てみたいです。


中さんのコメントの「変なこと」は、"こばさん"さんのコードが変だといっているように思うのですが?
_________________
こばさん
大ベテラン
会議室デビュー日: 2004/03/17
投稿数: 147
投稿日時: 2005-01-11 09:44
引用:

中さんのコメントの「変なこと」は、"こばさん"さんのコードが変だといっているように思うのですが?



 IDE が自動生成したコードの話なんですが。。。
(私がコード書かずに)


01 <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
02  
03  
04  CType(Me.sqlTable, System.ComponentModel.ISupportInitialize).BeginInit()
05  Me.pnlResult.SuspendLayout()
06  CType(Me.flxResult, System.ComponentModel.ISupportInitialize).BeginInit()
07  CType(Me.sqlConnection, System.ComponentModel.ISupportInitialize).BeginInit()
08  Dim configurationAppSettings As System.Configuration.AppSettingsReader = New System.Configuration.AppSettingsReader
09  CType(Me.sqlTable, System.ComponentModel.ISupportInitialize).BeginInit()
10  CType(Me.flxResult, System.ComponentModel.ISupportInitialize).BeginInit()
11 CType(Me.sqlConnection, System.ComponentModel.ISupportInitialize).BeginInit()
12  Me.SuspendLayout()
13
14  '
15  'sqlConnection
16  '
17  Me.sqlConnection.ConnectionString = CType(configurationAppSettings.GetValue("SqlConnectionString", GetType(System.String)), String)
18  Me.sqlConnection.SerializedSchemaXML = Me.sqlConnection.GetSchemaFromResources(resources, "sqlConnection", Me)
19  '
20  'sqlTable
21  '
22  Me.sqlTable.ConnectionComponent = Me.sqlConnection
23  Me.sqlTable.ConnectionType = C1.Data.SchemaObjects.ConnectionTypeEnum.SqlServer
24  Me.sqlTable.SchemaTableName = "C1_DATAEXPRESS_COMPOSITE"
25  Me.sqlTable.TableViewName = "CompositeTable"
26  Me.sqlTable.SerializedSchemaXML = Me.sqlTable.GetSchemaFromResources(resources, "sqlTable", Me)
27
28  '
29  'flxResult
30  '
31  Me.flxResult.ColumnInfo = "10,0,0,0,0,100,Columns:0{Name:""GUID"";Caption:""GUID"";Visible:False;AllowEditing:Fa" & _
32   "lse;DataType:System.Guid;}" & Microsoft.VisualBasic.ChrW(9)
33  ・
34  ・ (略/ColumnInfoは、もっと長い)
35  ・
36
37  Me.flxResult.DataSource = Me.sqlTable
38  Me.flxResult.Name = "flxResult"
39
40  CType(Me.sqlTable, System.ComponentModel.ISupportInitialize).EndInit()
41  CType(Me.flxResult, System.ComponentModel.ISupportInitialize).EndInit()
42  CType(Me.sqlConnection, System.ComponentModel.ISupportInitialize).EndInit()
43  Me.ResumeLayout(False)
44 End Sub

って感じです。(正しく動く状態)
 何かのタイミングで IDE がコードを再生成してくれちゃうと、14〜18行が、36行目付近に移動しちゃって、そうなると FrexGrid に正しいデータが入らなくなってしまいます。

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