2010-11-19 64 views
0

私は設計上の質問があります。私は深さが4段のネストされたリピータ構造を持っています。リピータは、「セクション1〜4」とみなされるデータを表示します。これらのセクションは、すべてデータベース内でジョブ記述に結び付けられています。組み込みリピータの処理の深さ

リピータの最も深い層の各アイテムに編集ボタンを追加します。しかし、リピータの深度はすべて同じではありません。職務説明には、各セクション(1-4)ごとに複数のエントリーがあるため、リピーターの必要性があります。しかし、キャッチは、前述のように、セクションの所与のエントリが1〜3〜1〜4〜1であってもよいということです。

これは、一度に1つの層にのみバインドするように設計されているということを難しくする1つの追加の前提条件です。次に、ドリルダウンするimgボタンをクリックし、次のデータセットを内側のリピータにバインドします。このため、バインドする回数を単純にカウントするよりも難しくなります。

私の質問は、どのようなプログラミング構造を採用すれば比較的速く、特定のエントリの深さを推測することができますか?明らかに、追加のチャージを必要としない解決策は、期限があると考えれば驚くべきものです。

ここはテーブルの構造です。それは変更できないことを覚えておいてください。それはもっと前だった。

Table  FK   PK 
Section1 | JobID | Sect1ID | 
Section2 | Sect1ID | Sect2ID | 
Section3 | Sect2ID | Sect3ID | 
Section4 | Sect3ID | Sect4ID | 

リピータ構造

<Repeater 1> 
    <Section 1 Data> 
    <Repeater 2> 
      <Section 2 Data>   
      <Repeater 3> 
       <Section 3 Data> 
       <Repeater 4> 
        <Section 4 Data> 
       </Repeater> 
      </Repeater> 
     </Repeater> 
</Repeater> 

私のアイデアのいくつか。

エントリの深さを計算するストアドプロシージャを作成します。 SectIDを渡し、SectIDに相対的な深さを返します。私はすでにセクションIDで隠れたasp:ラベルを介して個々のリピーターアイテムを識別する構造を持っています。

セクションを深さにマッピングするための辞書を維持します。ストアドプロシージャを使用します。ただし、アイテムがドリルされたときのエントリのみ。これは軽量で、ユーザーが興味を持っているアイテムだけを追跡します。

ユーザーがドリルダウンするたびに、深さが等しいかどうかを確認してください。 imgボタンをクリックし、そうでなければ、辞書の値をドリルしてインクリメントします。

他のアイデアや問題は私の解決策で予見されますか?

答えて

0

答えは実際には非常に簡単でした。トラッキングをすべて実行するのはせいぜい不器用なアプローチでした。解決策はそれよりはるかに簡単です。私は最も熟練したストアドプロシージャの作家ではないので、その数を私に負担してください。もし誰かがよりメンテナンス可能ですっきりしたバージョンを見せてくれるなら、それはすばらしいでしょう!

ソリューションは、すべてのSPの名前によって暗示文のビットすなわちTrueまたはFalseを返すこれら

bit doesSection2RecordExist(int prevSectID) 
bit doesSection3RecordExist(int prevSectID) 
bit doesSection4RecordExist(int prevSectID) 

それに関連する次のセクションレコードでピークし、ストアドプロシージャのセットを作成することです

今のところ、これらの方法をそのままネストメソッドに結びつけています(私の会社ではスキーマアプローチを使用しているため、dbアクセスコードは多少外見に見えるかもしれませんが、dbアクセス実装の詳細は必要な依存性ではありません)。と関係している。

public enum SectionType { First, Second, Third, Fourth }; 

    public static bool HasNextSection(int prevSectID, SectionType sectNum) 
    { 
     if (sectNum > SectionType.First) 
     { 
      var procName = "Section" + (int)sectNum + "RecordExists"; 
      using (var ov = new OneValue(Product.SafetyObs, procName)) 
      { 
       ov["PrevSectID"] = prevSectID; 
       return ov.Value.Bool; 
      } 
     } 
     return false; 
    } 

最後のステップでは、適切な時間に呼び出しを行って、階層の深い別のレコードがあるかどうかを確認します。これは、リピータのOnBoundイベントで行われます。

もう1つの注意点は、正しい前のセクションIDを取得することがより簡単になったことです。私はバインディング時間中にラベルの各階層レベルにそれを格納し、それを見えなくする。

protected void rptrSection1_Bound(object sender, RepeaterItemEventArgs e) 
    {       
     var lblID = e.Item.FindControl("lblSection1Id") as Label; 
     var sectID = int.Parse(lblID.Text); 

     if (!SectionLoader.HasNextSection(sectID, SectionType.Second)) 
     { 
      //things to do if there are no sections left 
     } 
     else 
     { 
      //things to do if there are sections left 
     } 

     return; 
    } 

、その後、私はすべての内部のリピータ2-4

と私は、これは将来的には似たように実行している人のための支援を期待することを繰り返して!!

関連する問題