2011-07-15 3 views
0

リピータ内に自分のユーザーコントロールがあります。リスト要素の評価に従って星を表示します。最初の縛りではすべてが大丈夫です、星の数は各項目で大丈夫です。次に、私はこのリストをフィルタリングするポストバックを行います。結果データはリピータにバインドされます。最初は、3つのフィルタリングの後に5つのエレメントがあったが、3つしか見えなかったが、星は結合前のように順番に並んでいると言うことができる。リピータ内のユーザーコントロール - ポストバック後も変更なし

私はポストバック中に、リピータ内の各コントロールを再作成し、適切な数の星を表示する必要があります(古いものではありません)。

私は間違っていますか?

リピーターは、updatePanel内にあります。

ここに私のコントロール "星" のコードです:

<span runat="server" id="starHolder" class="starsHolder" title=""> 
    <input runat="server" id="star1" name="star3" type="radio" class="star1" value="1" /> 
    <input runat="server" id="star2" name="star3" type="radio" class="star1" value="2" /> 
    <input runat="server" id="star3" name="star3" type="radio" class="star1" value="3" /> 
    <input runat="server" id="star4" name="star3" type="radio" class="star1" value="4"/> 
    <input runat="server" id="star5" name="star3" type="radio" class="star1" value="5"/> 
</span> 

、ここでは私のリピータのコードは次のとおりです。

<asp:Repeater EnableViewState="false" OnItemDataBound="RptrTopRated_OnDataItemBound" ID="rptrTopRated" runat="server"> 
    <ItemTemplate> 
    <li class="topRated" id='<%#DataBinder.Eval(Container.DataItem, "[id]")%>'> 
     <p> 
      <%# DataBinder.Eval(Container.DataItem, "[title]") %> 
     </p> 
     <span class="ratingStar"> 
      <cms:stars EnableViewState="false" runat="server" id="ctrlRating" McID='<%#System.Convert.ToInt32(DataBinder.Eval(Container.DataItem, "[id]"))%>' Mode="small"></cms:stars> 
     </span>  
     <a href="#" class="greenLink png" title="Leer más">Leer más</a> 
    </li> 
    </ItemTemplate> 
</asp:Repeater> 

がenableViewsstateがtrueに設定されている場合、それは問題ではありませんか偽です。チェックするには、選択し

protected void RptrTopRated_OnDataItemBound(object sender, RepeaterItemEventArgs e) 
    { 
     ((stars)e.Item.FindControl("ctrlRating")).SetStarsRating(); 
    } 

attrbuteを持つべきかを入力決定する(「チェックする」):私もコードを設定リピータのItemBoundイベントで

public void SetStarsRating() { 
    int rate = GetRate(); 
      this.starHolder.Attributes["title"] = McID.ToString(); 
      if(star1.Attributes["checked"] != null) star1.Attributes.Remove("checked"); 
      if(star2.Attributes["checked"] != null) star2.Attributes.Remove("checked"); 
      if(star3.Attributes["checked"] != null) star3.Attributes.Remove("checked"); 
      if(star4.Attributes["checked"] != null) star4.Attributes.Remove("checked"); 
      if(star5.Attributes["checked"] != null) star5.Attributes.Remove("checked"); 

      switch (rate) 
      { 
       case 1: 
        star1.Attributes["checked"] = "checked"; 
        break; 
       case 2: 
        star2.Attributes["checked"] = "checked"; 
        break; 
       case 3: 
        star3.Attributes["checked"] = "checked"; 
        break; 
       case 4: 
        star4.Attributes["checked"] = "checked"; 
        break; 
       case 5: 
        star5.Attributes["checked"] = "checked"; 
        break; 
      } 
} 

私ができるデバッグ中そのコードが正しい方法で動作し、良い1つ星のchecked属性を設定しますが、レンダリングされたHTMLには結果はありません。

+2

あなたのコードをしてください投稿。 –

+1

UpdatePanelを削除してください –

+0

私はあなたが深刻だとは思わない – gruber

答えて

1

ASP.Net Ajax Ratingコントロールの使用を検討すると、時間を大幅に節約できます。

http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/Rating/Rating.aspx

+0

@gruber正当な回答です。あなたはその制限について言及しませんでした。あなたの態度を確認してください、あなたはより良い応答を得るでしょう。 –

+0

私はこの問題について書いていますが、まったく別のものについて書いていますが、無意味なことは言わずに申し訳ありません。 – gruber

+1

@グルーバーおそらく、「あなたは私を冗談にしているに違いない」と言うより良い方法があるはずです。 –

0

私は私のスターコントロールでレンダリングし、それはそれが必要として働き始めでメソッドを追加しました:

protected override void Render(HtmlTextWriter writer){ 
     SetStarsRating(); 
     base.Render(writer); 
    } 
関連する問題