none
C#后台动态添加Repeater控件中的ItemPlate模板中的子控件...纠结中... 请教各位大侠.. RRS feed

  • 问题

  • 需要一个用C#从后台给Repeater添加子控件的程序,判断条件,如果条件成立,添加单选按钮,不成立添加多选按钮。。老大们,这个怎么做呢? 哦,提问的没提问明白... Repeater里还有一个Repeater ,在里面的Repeater中加子控件...格式是这样的

    <asp:Repeater ID="RptExamItem" runat="server"   onitemdatabound="RptExamItem_ItemDataBound"  >
       
            <ItemTemplate>
                <ul class="item">
                <li class="first" id="one"><%#Eval("EItemContent")%>(<%#Eval("POINT")%> 分)</li>
                <asp:Repeater ID="RptExamItemAnswer" runat="server"  >
                    <ItemTemplate>
                        <li><%#Eval("NumberSignDesc")%><%#Eval("ExamItemAsTitle")%>
                        <input id="ckanswer" name="ckanswer" type="checkbox" value='<%#Eval("NumberSign")%>' runat="server" onclick="OnTimeBegin()"  />
                     
                        </li>
                    </ItemTemplate>
                </asp:Repeater>
                </ul>
            </ItemTemplate>
            <FooterTemplate>
            <br />
            </tr>
        
            </FooterTemplate>

        </asp:Repeater>

    要给 RptExamItemAnswer 这个子Repeater添加控件(我想把CHECKBOX,换成从后台判断添加的),因为它不能直接写在ItemDataBound 或ItemDataCreate 事件中,所以... 纠结中..
    2009年12月10日 1:47

答案


  • 谢谢各位老大,问题已经解决了...

    解决方法如下: 用PlaceHolder搞定...
    如果有什么别的好的方法。一起研究一下..
    添加考题的答案选项

      protected void RptExamItem_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {

           string examItemID,optionSign; //两个变量,是存取本考题的考题ID,和单选或复选的标记
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
               examItemID = ((HiddenField)e.Item.FindControl("EItemID")).Value;
               optionSign =((HiddenField)e.Item.FindControl("OptionSign")).Value;

               DataSet ds = getAnswerItem(examItemID);  //getAnswerItem()返回一个考题的答案选项的数据源


               PlaceHolder phl =(PlaceHolder) e.Item.FindControl("ControlContainer");

               HtmlGenericControl span = new HtmlGenericControl("span");
               span.ID = "sphd";
               string listr = "";
              
                for(int i =0; i < ds.Tables[0].Rows.Count; i ++)
                {
                  
                    HtmlContainerControl li = new HtmlGenericControl("li");
                    li.ID = "lihd" + i;
                    listr = ds.Tables[0].Rows[i]["NumberSignDesc"].ToString() + ds.Tables[0].Rows[i]["ExamItemAsTitle"].ToString();
                    li.InnerHtml = listr;
                    span.Controls.Add(li);
                    if (optionSign == "False")
                    {
                        HtmlInputRadioButton rd = new HtmlInputRadioButton();
                        rd.ID = "rdanswer"+i;
                        rd.Name = "ckanswer" + examItemID;
                        rd.Value = ds.Tables[0].Rows[i]["NumberSign"].ToString();
                        rd.Attributes.Add("onclick", "OnTimeBegin()");
                        span.Controls.Add(rd);
                           
                    }
                    else
                    {
                        HtmlInputCheckBox ck = new HtmlInputCheckBox();
                        ck.ID = "ckanswer"+i;
                        ck.Name = "ckanswer" + examItemID;
                        ck.Value = ds.Tables[0].Rows[i]["NumberSign"].ToString();
                        ck.Attributes.Add("onclick", "OnTimeBegin()");
                        span.Controls.Add(ck);
                    
                    }
                    phl.Controls.Add(span);
               
                }
        }

    因为我要用RADIO 和checkbox 的值。这是取值的代码.

     HtmlGenericControl span = (HtmlGenericControl)this.RptExamItem.Items[i].FindControl("sphd");
             
                for (int j = 0; j < span.Controls.Count; j++)
                {
                    if (span.FindControl("rdanswer" + j) !=null)
                    {
                        HtmlInputRadioButton rd = (HtmlInputRadioButton)span.FindControl("rdanswer" + j);
                        if (rd.Checked)
                        {
                            checkanswer = checkanswer + rd.Value + "|";
                        }
                    }
                    if (span.FindControl("ckanswer" + j)!=null)
                    {
                        HtmlInputCheckBox ck = (HtmlInputCheckBox)span.FindControl("ckanswer" + j);
                        if (ck.Checked)
                        {
                            checkanswer = checkanswer + ck.Value + "|";
                        }
                    }

     

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/msy_84/archive/2009/12/11/4986144.aspx


    仰天大笑出门去,我辈岂是蓬蒿人
    • 已标记为答案 KeFang Chen 2009年12月14日 2:15
    2009年12月14日 1:58

全部回复

  • PlaceHolder控件可能满足你的需求
    另外不太明白你的意思
    2009年12月10日 7:44
  • 你好,

    你说的这个通过前台绑定或者在ItemDataBound 应该都可以实现的。
    具体看你是如何给两个repeater控件数据源的。 如果你能在这方面提供更多信息我们也许可以帮到你。
    Microsoft Online Community Support
    2009年12月11日 2:55
  • 谢谢您的回复 我正在尝试用PLACEHODLER ,效果是可以实现的。但是取值取不出来... 继续纠结中..
    2009年12月11日 2:59
  • 谢谢您的回复

    前台代码就这样,数据源全是在后台绑定的。
    Page_Load 事件中 给第一个Repeater控件 绑定数据源 RptExamItem.DataSourceID=getDataSource();
    另外,在 外面的Repeater的ItemDataBound  事件中 RptExamItem_ItemDataBound  给里面的子控件Repeater 绑定数据源的
    Repeater rp2 = (Repeater)e.Item.FindControl("RptExamItemAnswer");
    rp2.DataSource = ds;
     rp2.DataBind();

    我现在想实现的功能是  :有个条件 IF (条件true){rp2 中的 checkbox 换成 redio} ELSE {rp2 中输出 checkbox}


    并且这些CHECKBOX 和redio 的值 都能在 ItemDataBind事件方法 以外 单独取出来...


    仰天大笑出门去,我辈岂是蓬蒿人
    2009年12月11日 3:08
  • 你这个给rp2定义事件 和rp1一样
    2009年12月11日 8:03

  • 谢谢各位老大,问题已经解决了...

    解决方法如下: 用PlaceHolder搞定...
    如果有什么别的好的方法。一起研究一下..
    添加考题的答案选项

      protected void RptExamItem_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {

           string examItemID,optionSign; //两个变量,是存取本考题的考题ID,和单选或复选的标记
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
               examItemID = ((HiddenField)e.Item.FindControl("EItemID")).Value;
               optionSign =((HiddenField)e.Item.FindControl("OptionSign")).Value;

               DataSet ds = getAnswerItem(examItemID);  //getAnswerItem()返回一个考题的答案选项的数据源


               PlaceHolder phl =(PlaceHolder) e.Item.FindControl("ControlContainer");

               HtmlGenericControl span = new HtmlGenericControl("span");
               span.ID = "sphd";
               string listr = "";
              
                for(int i =0; i < ds.Tables[0].Rows.Count; i ++)
                {
                  
                    HtmlContainerControl li = new HtmlGenericControl("li");
                    li.ID = "lihd" + i;
                    listr = ds.Tables[0].Rows[i]["NumberSignDesc"].ToString() + ds.Tables[0].Rows[i]["ExamItemAsTitle"].ToString();
                    li.InnerHtml = listr;
                    span.Controls.Add(li);
                    if (optionSign == "False")
                    {
                        HtmlInputRadioButton rd = new HtmlInputRadioButton();
                        rd.ID = "rdanswer"+i;
                        rd.Name = "ckanswer" + examItemID;
                        rd.Value = ds.Tables[0].Rows[i]["NumberSign"].ToString();
                        rd.Attributes.Add("onclick", "OnTimeBegin()");
                        span.Controls.Add(rd);
                           
                    }
                    else
                    {
                        HtmlInputCheckBox ck = new HtmlInputCheckBox();
                        ck.ID = "ckanswer"+i;
                        ck.Name = "ckanswer" + examItemID;
                        ck.Value = ds.Tables[0].Rows[i]["NumberSign"].ToString();
                        ck.Attributes.Add("onclick", "OnTimeBegin()");
                        span.Controls.Add(ck);
                    
                    }
                    phl.Controls.Add(span);
               
                }
        }

    因为我要用RADIO 和checkbox 的值。这是取值的代码.

     HtmlGenericControl span = (HtmlGenericControl)this.RptExamItem.Items[i].FindControl("sphd");
             
                for (int j = 0; j < span.Controls.Count; j++)
                {
                    if (span.FindControl("rdanswer" + j) !=null)
                    {
                        HtmlInputRadioButton rd = (HtmlInputRadioButton)span.FindControl("rdanswer" + j);
                        if (rd.Checked)
                        {
                            checkanswer = checkanswer + rd.Value + "|";
                        }
                    }
                    if (span.FindControl("ckanswer" + j)!=null)
                    {
                        HtmlInputCheckBox ck = (HtmlInputCheckBox)span.FindControl("ckanswer" + j);
                        if (ck.Checked)
                        {
                            checkanswer = checkanswer + ck.Value + "|";
                        }
                    }

     

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/msy_84/archive/2009/12/11/4986144.aspx


    仰天大笑出门去,我辈岂是蓬蒿人
    • 已标记为答案 KeFang Chen 2009年12月14日 2:15
    2009年12月14日 1:58