- - PR -
InitializeComponent 内に自動生成されるコントロールの順序について
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 が自動生成するコードで、コントロールの初期化の順序はどのようにして決まっているのでしょうか? それとも、初期化の順序に依存しないようなコントロールであるべきなんでしょうか? | ||||
|
投稿日時: 2005-01-09 11:12
コンストラクタで変なことしてるからそんなことになるんですよね?
初期化はForm_Loadから呼ぶことを念頭に、順番に影響されないつくりにしましょう。 | ||||
|
投稿日時: 2005-01-09 13:30
>コンストラクタで変なことしてるからそんなことになるんですよね?
やはりですか。。 私もソースが見てみたいです。 順序依存のコントロールとは、某社の DataObject for .NET と、それに連携できるコントロールたちです。。。 | ||||
|
投稿日時: 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 と、それに連携できるコントロールたちです。。。 使い物になるものから使い物にならないものまで多様なものが市場には流れます ので、使い物にならないものを握らないように有る程度評価をしてから導入する のが正しいでしょう。 導入を決めた以上は愚痴ってもしょうがない事です。 | ||||
|
投稿日時: 2005-01-09 18:11
>初期化に関わる生成順序とプロパティの設定順序等は別物ですけど、どっちの話でしょうか
プロパティの設定順序です。 >使い物になるものから使い物にならないものまで多様なものが市場には流れます >ので、使い物にならないものを握らないように有る程度評価をしてから導入する >のが正しいでしょう。 >導入を決めた以上は愚痴ってもしょうがない事です。 ええ、VB2の時代から何度も苦汁を味わってます。 ひとまず継承さえしなければ不具合が起きなかったので油断しました。 今回の件は、コードレベルで順序を入れ替えれば回復するので、それで回避してます。 | ||||
|
投稿日時: 2005-01-09 20:55
http://www.atmarkit.co.jp/fdotnet/tools/dotfuscator/dotfuscator_02.html 見てよいのかはわかりませんが。 | ||||
|
投稿日時: 2005-01-10 18:27
中さんのコメントの「変なこと」は、"こばさん"さんのコードが変だといっているように思うのですが? _________________ | ||||
|
投稿日時: 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 に正しいデータが入らなくなってしまいます。 |