2017-05-22 2 views
0

Je suis chargé de modifier une ancienne application .Net 1.1 qui ne peut pas être mise à niveau pour le moment. L'application est horriblement conçue, avec des appels partout, des fonctions répétées, du code inutilisé qui n'est même pas commenté, et de multiples itérations du même usercontrol sans notation quant à laquelle est réellement utilisé. Les contrôles usuels qui sont utilisés sont mélangés avec des contrôles qui ne sont pas du tout des contrôles utilisateur, mais tout aussi complexes, lorsqu'ils sont implémentés dans une centrale Form.Comment trouver un contrôle sans connaître le contrôle parent, restreint par instance (.Net 1.1)

Le central appelé MainForm a un TabControl qui possède lui-même WorkForm dans chaque page. Ceux-ci sont générés dynamiquement à partir de l'entrée de l'utilisateur. Le WorkForm est un contrôle utilisateur et contient le méli-mélo de contrôles utilisateur et de contrôles/panneaux contenus/non confinés mentionnés précédemment. La filiation peut être dynamique entre un formulaire et un contrôle basé entièrement sur les données chargées, ce qui ajoute à la complexité du problème. Une instance d'un contrôle utilisateur qui fait partie du contrôle utilisateur WorkForm sur son quatrième onglet a une grille de données, et ce que je dois faire est de modifier le code qui ajoute une nouvelle ligne dans cette grille de données pour vérifier un contrôle à l'extérieur du contrôle de l'utilisateur, mais dans le même WorkForm, et obtenir ses SelectedValue. J'ai essentiellement besoin de "Où est Waldo" le contrôle dont j'ai besoin, mais avec suffisamment de "Carmen Sandiego" pour m'adapter au fait que la hiérarchie de contrôle n'est pas garantie. Aussi, la loi de Demeter sur celle-ci ressemble plus à "Loi de Déméter? Je ne la connais même pas". donc vraiment kludgy appels aux variables statiques qui ne devraient pas être à peu près comment l'application fonctionne.

Quelque chose comme:

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

Quelle serait la meilleure façon d'aller à la chasse à ce contrôle, étant donné que la relation n'est pas garanti? P.S. Je n'ai pas écrit l'application. Je suis juste coincé avec des instructions pour ajouter un changement à ce cauchemar.

Répondre

0

Cela dépend entièrement de ce que vous savez sur le contrôle.

Si elle a un nom (ou et d'autres types de critères uniques), vous pouvez faire une recherche récursive sur tous les conteneurs comme celui-ci:

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; 
    } 
} 

Sinon, votre meilleur pari serait probablement de trouver la logique qui place la contrôlez et modifiez-le pour y stocker une référence quelque part. Ce dernier est probablement préférable car il vous donne une meilleure connaissance de l'application, mais pourrait aussi prendre beaucoup plus de temps.

+0

C'est la meilleure façon d'y arriver dans une situation aussi difficile, même si j'ai finalement réussi à convaincre ceux qui sont plus haut dans l'échelle d'adopter une approche différente. – CDove