【问题标题】:Populating DropDownList inside Repeater not working在Repeater中填充DropDownList不起作用
【发布时间】:2010-11-28 19:13:57
【问题描述】:

我正在尝试在中继器中填充下拉列表,但我不是很成功。 我可能使用了错误的 EventArgs e

这是我的 aspx 代码:

        <asp:Repeater runat="server" id="criteriaScore">
            <HeaderTemplate>
              <ul>         
                <li class="header"><span class="item">Kriterie</span><span class="value">Poeng</span><span class="description">Beskrivelse</span></li>
            </HeaderTemplate>
            <ItemTemplate>
                <li>
                    <span class="item"> <%# Eval("criteria") %>:</span>
                    <asp:DropDownList id="ddlRating" runat="server" autopostback="true" enableviewstate="false"></asp:DropDownList>
                    <span class="value score<%# Eval("lvl") %>" title="<%# Eval("description") %>"> </span>
                </li>
            </ItemTemplate>
            <FooterTemplate>
                </ul>  
            </FooterTemplate>
        </asp:Repeater>

以及背后的代码:

    protected void criteriaScore_ItemDataBound(object sender, DataListCommandEventArgs e)
    {
        DropDownList ddl = (DropDownList)e.Item.FindControl("ddlRating");

        for(int i=1; i > 5; i++)
        {
            ddl.Items.Add(new ListItem(i.ToString(), i.ToString()));
        }
    }

有人可以指导我走正确的道路吗? :)

【问题讨论】:

  • 您应该调试应用程序,特别是打破 Items.Add 行以确保其发生。
  • 我无法使用 Visual Web Developer 2008 进行调试 :(

标签: c# .net asp.net data-binding repeater


【解决方案1】:

改变: for(int i=1;i > 5;i++) 到: for(int i=1;i

或者:

    using System.Linq;

    ddl.DataSource = Enumerable.Range(1, 5);
    ddl.DataBind();
    ddl.SelectedValue = yourValue

【讨论】:

    【解决方案2】:

    尽管关于这个问题的其他答案,ItemDataBound 事件不应用于绑定控件数据,请在控件级别执行此操作。

    在您的下拉列表中定义数据绑定事件:

    <asp:DropDownList runat="server" ID="ddlYourDDL"  OnDataBinding="ddlYourDDL_DataBinding">
    

    然后实现 OnDataBinding 事件:

    protected void ddlYourDDL_DataBinding(object sender, System.EventArgs e)
    {
        DropDownList ddl = (DropDownList)(sender);
        for (int i = 1; i < 5; i++)
        {
             ddl.Items.Add(new ListItem(i.ToString(), i.ToString()));
        }
    
        // Now that the items are all there, set the selected property
        ddl.SelectedValue = Eval("selectedfieldname").ToString();
     }
    

    您应该尝试在控件级别执行所有数据绑定,而不是搜索事物并让您的网格必须知道它包含的内容。每个控件都可以自行处理 ;) 这样可以更轻松地向模板添加和删除控件,并使这些更改保持隔离。

    【讨论】:

    • 谢谢。上面的答案有效,但由于这是更好的做法,我会选择这个解决方案:)
    【解决方案3】:

    在 .aspx 页面中:

    <asp:Repeater runat="server" id="criteriaScore"   
                  OnItemDataBound="criteriaScore_ItemDataBound">
    

    在代码隐藏中:

    protected void criteriaScore_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
    
        // This event is raised for the header, the footer, separators, and items.
    
        // Execute the following logic for Items and Alternating Items.
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType ==   
            ListItemType.AlternatingItem) 
        {
             DropDownList ddl = (DropDownList)e.Item.FindControl("ddlRating");
    
             for(int i=0; i < 5; i++)
             {
                ddl.Items.Add(new ListItem(i.ToString(), i.ToString()));
             }
        }
     }  
    

    【讨论】:

      【解决方案4】:

      无论方法如何实现(有几种方法),ItemDataBound 事件都不会附加到标记中的转发器。

      【讨论】:

        【解决方案5】:
        for(int i=1;i > 5;i++)
        

        应该读...

        for(int i=1;i < 5 ;i++)
        

        【讨论】:

        • +1,此外,通常认为用i=0开始迭代是一种好习惯
        【解决方案6】:

        private void criteriaScore_ItemDataBound(object source, RepeaterCommandEventArgs e)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-05-23
          • 2011-04-06
          • 2015-10-17
          • 1970-01-01
          • 2018-01-19
          • 1970-01-01
          • 2011-09-25
          相关资源
          最近更新 更多