AliRıza Adıyahşi
AliRıza Adıyahşi

Reputation: 15866

Asp.Net set control that in specific row in repeater?

repeater code:

<asp:Repeater ID="Repeater_sorular" runat="server" OnItemCommand="Repeater_sorular_ItemCommand"
        OnItemDataBound="Repeater_sorular_ItemBound">
        <HeaderTemplate>
        </HeaderTemplate>
        <ItemTemplate>
            <table>
                <tr>
                    <td>
                        <rad:RadChart ID="RadChart1" runat="server" DefaultType="Pie" Width="700" >
                            <PlotArea Appearance-FillStyle-FillType="Gradient" Appearance-FillStyle-MainColor="#D90420"
                                Appearance-FillStyle-SecondColor="#FFAD4A" Appearance-Border-Visible="false">
                                <EmptySeriesMessage>
                                    <TextBlock Text="Seçilen anket henüz oylanmamıştır.">
                                        <Appearance TextProperties-Font="Tahoma, 10pt, style=Bold">
                                        </Appearance>
                                    </TextBlock>
                                </EmptySeriesMessage>
                            </PlotArea>
                            <ChartTitle>
                                <TextBlock Appearance-TextProperties-Font="Tahoma">
                                </TextBlock>
                            </ChartTitle>
                            <Appearance ImageQuality="HighQuality" Border-Color="#DFDDDD" TextQuality="ClearTypeGridFit">
                            </Appearance>
                            <Series>
                                <rad:ChartSeries Type="Pie" Appearance-TextAppearance-TextProperties-Color="#FFFFFF"
                                    Appearance-TextAppearance-TextProperties-Font="Tahoma">
                                </rad:ChartSeries>
                            </Series>
                            <Legend Visible="True">
                                <TextBlock Visible="True">
                                </TextBlock>
                            </Legend>
                        </rad:RadChart>
                    </td>
                    <td>
                        <div style="font-weight: bolder; padding: 5px;">
                            <%#(((RepeaterItem)Container).ItemIndex+1).ToString() %>.
                            <%#Eval("Subject")%>
                        </div>
                        <asp:BulletedList ID="BulletedList_secenekler" runat="server" DataSource='<%#Eval("Secenekler")%>'
                            DataTextField="OptionName" DataValueField="OptionId" CssClass="sira_numarali">
                        </asp:BulletedList>
                    </td>
                </tr>
            </table>
        </ItemTemplate>
        <FooterTemplate>
        </FooterTemplate>
    </asp:Repeater>

repeater ItemDataBound:

protected void Repeater_sorular_ItemBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        int SurveyId = Int32.Parse(Request.QueryString["anket_id"]);

        var sorular = from sr in db.TableSurveyQuestions
                      where sr.SurveyId == SurveyId
                      select sr;

        //int repeater_satir = 0;
        foreach (var soru in sorular)
        {
            RadChart RadChart1 = new RadChart();
            RadChart1 = (RadChart)e.Item.FindControl("RadChart1");

            ChartSeries s = RadChart1.Series.GetSeries(0);
            s.Appearance.LegendDisplayMode = ChartSeriesLegendDisplayMode.ItemLabels;
            s.Clear();
            s.Appearance.ShowLabels = true;
            s.Appearance.LabelAppearance.Dimensions.Margins.Bottom = 7;
            s.PlotArea.IntelligentLabelsEnabled = true;
            s.DataYColumn = "VoteCount";

            int oy_sayisi = 0;

            foreach (var secenek in soru.TableSurveyOptions)
            {
                int toplam_cevap_sayisi = secenek.TableSurveyVotes.Count;
                int dogru_cevap_sayisi = secenek.TableSurveyVotes.Where(a => a.VoteStatus == true).Count();
                double yuzde = ((double)dogru_cevap_sayisi / (double)toplam_cevap_sayisi) * 100;

                ChartSeriesItem seriesItem = new ChartSeriesItem();
                seriesItem.YValue = Math.Round(yuzde, 2);
                seriesItem.Name = secenek.OptionName;
                seriesItem.ActiveRegion.Tooltip = secenek.OptionName;
                seriesItem.Label.TextBlock.Text = secenek.OptionName + " %" + Math.Round(yuzde, 2).ToString();
                seriesItem.Appearance.Border.Color = Color.Silver;
                seriesItem.Appearance.FillStyle.FillType = Telerik.Charting.Styles.FillType.Solid;
                s.Items.Add(seriesItem);
                RadChart1.Series.Add(s);

                oy_sayisi = secenek.TableSurveyVotes.Count;
            }
            RadChart1.ChartTitle.TextBlock.Text = db.TableSurveyQuestions.Where(a => a.SurveyId == SurveyId).FirstOrDefault().TableSurvey.Title;
            RadChart1.Legend.TextBlock.Text = "Toplam : " + oy_sayisi + " Oy ";

            //repeater_satir++;
        }
    }
}

when I write this code, all charts are showing the last object values. I want to set each chart with different data.

How can I do this.

Thanks.

Upvotes: 0

Views: 2029

Answers (1)

Jupaol
Jupaol

Reputation: 21365

You could use the ItemIndex property

<asp:Repeater runat="server" ID="myRepeater" OnItemDataBound="myRepeater_ItemDataBound">
    <ItemTemplate>
        <asp:Label Text='<%# Eval("Id") %>' runat="server" ID="myRepeaterLabel" />
    </ItemTemplate>
</asp:Repeater>

Code behind:

    protected void myRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            switch (e.Item.ItemIndex)
            {
                case 3:
                    Label l = (Label)e.Item.FindControl("myRepeaterLabel");
                    l.Text += "whatever";
                    break;
                default:
                    break;
            }

        }
    }

Output:

enter image description here

Edited

I am not sure if this would help but you should bind your repeater like this:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.IsPostBack)
        {
            this.BindRepeater();
        }
    }

    private void BindRepeater()
    {
        var r = Builder<Product>.CreateListOfSize(20).Build();
        this.myRepeater.DataSource = r;
        this.myRepeater.DataBind();
    }

And just modify specific values already bindded in the ItemDataBound event

Upvotes: 3

Related Questions