2017-08-23 11 views
0

リストをリピーターにバインドしようとしています。私のコードは次のとおりです。C#データリストとループ内のリスト

protected void Page_Load(object sender, EventArgs args) 
     { 
      CaseEnt MyCase = MyLib.IAdapters.CaseAdapter.GetCaseRecordForCaseNumber("14CF000810"); 
      List<Charge> charges = MyLib.IAdapters.ChargeAdapter.GetByCaseNumber("14CF000810"); 
      if (charges != null && charges.Count > 0) 
      { 
       foreach (Charge chg in charges) 
       { 
        List <Sentence> sentences = MyLib.IAdapters.SentenceAdapter.GetByChargeObjectID(chg.ChargeObjectID); 
        rpt1.DataSource = sentences; 
        rpt1.DataBind(); 
       } 
      } 
     } 

私はコードにストップを入れて、どの値がリストに流れているのかを確認しました。文リストが入力されているときは値が表示されますが、データソースとして割り当てられているときにチェックすると空白になります。

私は間違っていますか?

私はしばらくの間この作業をしていましたが、インターネットで答えを探し、誰も私を助けることができないようです。たとえそれが違う方法を説明しているとしても、どんな援助も感謝します。

答えて

1

foreachループ内のリピータにデータソースを割り当てることは難しいです。

リピータにデータソースとして新しいセットの文が割り当てられるたびに、以前に結合されたデータ(つまり文)が削除され、新しい文が追加されません。あなたのケースでは

、担当の最後のインスタンス - は、任意の文章を持っていないので、List <Sentence> sentencesforeach内側のループの値がnullになります。それがなぜこのように振る舞っているのかを私が考えることができる唯一のケースです。

rpt1.DataSource = sentences; 

あなたがコントロールをリピータにバインドするすべての料金から全ての文章をしたい場合は、あなたがでそれらのすべてを収集することをお勧めします - あなたはそれが事実だかどうかを確認するために、この行にブレークポイントを配置することあなたのCaseNumberを最初にしてから、ループをforeachループせずに1回バインドしてください。


UPDATE:


あなたは2つの方法書かれている - 与えられたケース数の料金のリストを取得するには1を、そして第二に、与えられた料金で文章のリストを取得します。

代わりに、与えられたケース番号のすべての料金のためのすべての文章を取得するこれらの二

  • 書き込みのみ1つの方法のいずれかを行うことができます。 List <Sentence>オブジェクトでこのメソッドの結果を取得し、それを直接Repeaterコントロールでバインドします。

  • 新しいメソッドを記述するのではなく、foreachループにリピーターをバインドする代わりに、List <Sentence>オブジェクトの各請求に対して文章を追加し続けることができます。このよう

List <Sentence> sentences; 
foreach (Charge chg in charges) 
{ 
    List <Sentence> sentencesForThisCharge = MyLib.IAdapters.SentenceAdapter.GetByChargeObjectID(chg.ChargeObjectID); 
    if (null != sentencesForThisCharge) 
    { 
     sentences.Add(sentencesForThisCharge); 
    } 
} 

rpt1.DataSource = sentences; 
rpt1.DataBind(); 

私はこのことができます願っています。

+0

本当にありがとうございます。私はC#のかなり新しいことを説明する必要があります。 foreachループなしでこれを行う方法を教えてください。文章を取得する唯一の方法は、ChargeObjectIDです。 – Taborator

+0

次に、私の質問は、私が2番目の方法にChargeIDを渡す方法です。正しい文章が得られますか? – Taborator

+0

更新された回答を確認してください。 – Cooleshwar

0

バインドをリピータにリセットし、既にバインドされているものを上書きします。

文のリストとdatabindコマンドをループの外側で削除すると、それが機能します。

if (charges != null && charges.Count > 0) 
     { 
      List<Sentence> sentences = new List<Sentence>(); 
      foreach (Charge chg in charges) 
      { 
       sentences.AddRange(MyLib.IAdapters.SentenceAdapter.GetByChargeObjectID(chg.ChargeObjectID)) 

      } 
      rpt1.DataSource = sentences; 
      rpt1.DataBind(); 
     } 
+0

ありがとうございました!これは機能します。私は1つのフォローアップの質問を持っています。 ここで、ASP.NETのネストされたリピーターの両方の料金と文章から異なるフィールドを表示する場合はどうすればよいですか?そのクラスのコンテキスト外でリストをDataBindしようとすると、それを認識できなくなるので、 – Taborator

+0

asp.net webformsを使用している場合は、親リピータのonitemdataboundイベントが必要です。このイベント内でネストされたリピータをバインドできます。上記の回答があなたの最初の問題を解決した場合は、それを受け入れられた回答としてマークしてください –

関連する問題