2017-05-22 6 views
0

今回はアップグレードできない古い.Net 1.1アプリを変更する必要があります。アプリはひどく設計されており、場所を問わず、繰り返し機能、コメントアウトされていない未使用コード、実際に使用されているものについては表記なしで同じユーザーコントロールの複数の繰り返しがあります。使用されるユーザコントロールは、ユーザコントロールではないコントロールと混在しますが、中央のFormに実装された場合とまったく同じです。親コントロールを知らずにコントロールを見つける方法(.Net 1.1)

MainFormと呼ばれる中央のFormは、それ自体がWorkFormを各ページに保持しています。これらは、ユーザー入力から動的に生成されます。 WorkFormは、ユーザーコントロールであり、前述のユーザーコントロールと含まれている/含まれていないコントロール、パネルなどが含まれています。親子は、完全にロードされているデータに基づいてフォームとコントロールの間で動的になり、問題の複雑さが増します。

4番目のタブのWorkFormユーザーコントロールの一部であるユーザーコントロールのインスタンスには、データグリッドがあります。そのデータグリッド内の新しい行を追加するコードを変更する必要がありますユーザーコントロールの同じWorkFormにあり、そのSelectedValueを取得します。私は本質的に "Where's Waldo"に必要なコントロールが必要ですが、コントロール階層が保証されていないという事実に適応するのに十分な "Carmen Sandiego"が必要です。また、Demeterの法則は、「Demeterの法則」のようなものです。そうすべきではないはずの静的変数への本当にクルージングな呼び出しは、アプリの実行方法とほとんど同じです。関係が保証されていないため、このコントロールを追い詰めるについて行くための最良の方法だろう何

Dim row as DataRow = aDataTable.NewRow() 
    row[12] = Me.Parent.Cousin.TwiceRemoved.OnFathersSide.NotThatOne _ 
       .TheOtherOne.SelectedValue 

のようなものを? P.S.私はアプリを書いていない。私はちょうどこの悪夢に変更を加えるための指示に立ち往生しています。

答えて

0

これは、あなたがコントロールについて知っていることに完全に依存します。

それは名前(または、ユニークな基準の他の種類を)持っている場合は、このようなすべてのコンテナの上に再帰的な検索を行うことができます:

public static Control WhereInTheFormIsWaldoSandiego(Container c, String name) 
{ 
    foreach (Control ctrl in c.Controls) 
    { 
    if (ctrl.Name.Equals(name)) return ctrl; 
    if (ctrl is Container) 
    { 
     Control inner = WhereInTheFormIsWaldoSandiego(ctrl as Container, name); 
     if (inner != null) return ctrl; 
    } 
    return null; 
    } 
} 

そうでなければ、あなたの最善の策は、おそらく置くロジックを見つけることでしょうどこかの参照を格納するように制御して変更します。

これはおそらくアプリケーションに関する知識が豊富になるため、後で使用する方が望ましいと思われますが、時間がかかることもあります。

+0

このような状況の中でこれを実行するには、これは最善の方法ですが、最終的には、はっきりと別のアプローチを取るようにラダーを説得することができました。 – CDove

関連する問題