1

多くのコードがここに収まらないことは承知していますが、一般的な指示またはポインタを求めています。

ラッパー、タブ、パネル、リスト、行、アイテムの (外側から内側へ) 対話型ガジェット用に .NET ユーザー コントロールを 6 つの深さでネストしました。

ネストされたコントロールから祖先コントロールへの参照を取得しようとしています。

具体的には、埋め込まれた「曾孫」コントロールの背後にあるコードにこのコードがあります。それは機能しますが、非常に醜いです:

MyTab _myTab = this.Parent.Parent.Parent.Parent.FindControl(thisTab) as MyTab;

これは等しく {ASP.controls_appname_widget_mywidget_mytab_ascx}、正しいです。

Page.FindControl("MyWrapper:MyPanel:etc.....) のようなことができることはわかっていますが、構造または ID が変更される可能性があるため、これもお勧めできません....

まともな代替手段はありますか?

4

5 に答える 5

2

コンポーネントを無知にするのが最善であることを忘れないでください。どのコントロールにも、階層内でそれより上位にあるものに関する知識を持たせたり、階層内でそれ自体より下にあるコントロールに関するインターフェースのみの知識を持たせたりすることは決してありません。このアーキテクチャーのアプローチは、長期的には多くの痛みや苦しみを軽減し、現在のような状況を回避します。

現在の問題を修正するための最良の方法はMyTab、親コントロールによって設定可能なコントロールにメンバーを作成することです。これは完全な解決策ではありません。なぜなら、あなたのコントロールは他の人を完全に無視しているわけではありませんが、少なくともMyTab参照を取得する方法を知る必要はなくなります - それはあなたに提供されます.

したがって、次のようなプロパティを作成し、このプロパティをページ内またはコントロール内のどこかParentTabの参照と等しくなるように設定します。MyTabMyTab

于 2009-01-15T01:14:22.227 に答える
0
public static class Extension{
 public static Control FindControlRecursive(this Control control, string idToFind)
 {
     Control result;
     if(control != null){
        result = control.FindControl(idToFind);
     }
     if(result != null){ return result; }
     if(result == null && control.Parent != null){
         return control.Parent.FindRecursive(idToFind);
     }
     return null;
  }
}
于 2010-12-04T14:30:09.883 に答える
0

コントロールの使い方次第だと思います。コントロールが 1 つのビジネス ニーズに対応し、ユース ケースを満たすために 1 つのページで使用されるだけの場合は、インターフェイスやプロパティに夢中になる必要はありません。parent.parent.parent.etc のアイデアに問題はありません。私自身何度も利用しました。ただし、プロパティにラップして、必要なときにいつでも this.MyGreatGreatGrandFatherProperty を呼び出すことができるようにします。読みやすくなり、階層の深さが変わった場合でも、修正する場所は 1 か所だけです。

使用を制御しない、または多くのユースケースで必要となる汎用コンポーネントである場合は、親のプロパティを追加して、誰が分離されているかを示す必要があります。

于 2009-01-15T02:03:56.403 に答える
0

@Andrew、自分のスレッドをハイジャックするのではなく、設計アプローチを明確にして議論するだけです。あなたは、「どのコントロールにも、階層内でそれより上位にあるものを認識させたくない...」と言いましたが、これは明らかな理由から、優れた設計戦略です。しかし、ある種の集中管理機能が組み込まれたラッパー コンテナーの場合はどうでしょうか。たとえば、.NET では、ネストされたマスター ページ内の ScriptManager コントロール。スクリプト マネージャーは 1 回だけ作成し、アプリケーション内のさまざまなコントロールで使用できるようにする必要があります。たとえば、アプリの埋め込みコントロール内の UpdatePanel は、その ScriptManager の存在を知りたいと思うでしょう。これは間違ったアプローチですか?

私の設計も同様です。最も外側のラッパー コンテナーはオブジェクトの永続性を管理し、各コントロールはその状態をそのマネージャーに保存できます。私は今、ラッパー デリゲートがこれに最適な設計であると考えています。私はParent.Parentが好きではないので。参照するためだけにコントロール ID をトラバースすることもありません。どんなコメントでも大歓迎です。

于 2009-01-15T17:16:24.173 に答える
-1

こんにちは、実際には独立したプロジェクト (ライセンス == LGPL) である WebControl セレクターを使用できますが、それでもメインのRa-Ajaxダウンロードの一部です...

ここでコードとサンプルの使用を確認してください...

次に、Page オブジェクトから検索するだけで、デリゲートの (どんな) 基準にも一致するコントロールを再帰的に探します...

于 2009-01-15T01:05:42.447 に答える