【问题标题】:Selected value of dropdownlist in repeater control - with predefined items中继器控件中下拉列表的选定值 - 带有预定义项目
【发布时间】:2012-03-13 15:41:50
【问题描述】:

我在具有预定义项的 ASP.NET 页面中的转发器控件内有一个 DropDownList。将数据绑定到转发器控件后,我将如何设置它的选定值?

例如,我有这样的代码:

<asp:DropDownList ID="cboType" runat="server">
    <asp:ListItem Text="Communication" Value="Communcation" />
    <asp:ListItem Text="Interpersonal" Value="Interpersonal" />
</asp:DropDownList>

因为 DropDownList 控件没有 SelectedValue 前端属性,所以无法在控件级别进行设置。相反,您必须使用 列表项 的 selected 属性。理想的情况是:

<asp:DropDownList ID="cboType" runat="server" SelectedValue='<%# Eval("Type_Of_Behavior") %>'>
    <asp:ListItem Text="Communication" Value="Communcation" />
    <asp:ListItem Text="Interpersonal" Value="Interpersonal" />
</asp:DropDownList>

很遗憾,这行不通,有什么想法吗?

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    使用来自 Pankaj Garg 的代码(谢谢!)我设法编写了选择正确值的方法。我无法将其标记为答案,因为该答案是选择一个静态值,但不是来自数据库的值。函数如下:

    protected void rpt_ItemDataBound(object sender, RepeaterItemEventArgs e)
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            DropDownList cbo = (DropDownList)e.Item.FindControl("cboType");
            Behaviour b = (Behaviour)e.Item.DataItem;
    
            for (int i = 0; i < cbo.Items.Count; i++)
            {
                if (b.Type_of_Behaviour == cbo.Items[i].Value)
                    cbo.Items[i].Selected = true;
                else
                    cbo.Items[i].Selected = false;
            }
        }
    }
    

    感谢所有提供帮助的人。

    【讨论】:

    • 谁能告诉我什么会代替“行为”。还要写什么来代替“Type_of_Behaviour”。尝试了很多东西,但无法理解。请大体告诉我!请。
    • Behavior 是您正在使用的模型类,Type_of_Behavior 是模型的属性。因此,如果您的模型名称是 Foo 并且您的属性是 Bar,则您可以将 Behaviour 替换为 Foo 并将 Type_of_Behavior 替换为 Bar。希望对您有所帮助。
    【解决方案2】:

    在运行时你可以像下面这样使用转发器的OnItemDataBound..

    示例 HTML

    <asp:Repeater ID="rpt" runat="server" OnItemDataBound="YourhandlerName" >
    </asp:Repeater>
    

    OnItemDataBound 事件处理程序的示例代码

    protected void rpt_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            DropDownList DropDownID = (DropDownList)e.Item.FindControl("DropDownID");
            int ItemNo = ((YourClassName)e.Item.DataItem).Yourproperty;
            DropDownID.Items[ItemNo].Selected = true;
        }
    }
    

    【讨论】:

    • 这绝对是在正确的轨道上,除了它总是选择第二个项目。我已经设法通过使用您提供的代码和 e.Item.DataItem 来解决这个问题。由于我在 StackOverflow 上的声誉低于 100,我无法再发布 6 个小时的答案。到时候我会发布它以帮助其他人。谢谢!
    • 如果我将索引存储在数据库中,这将起作用。但是,您需要使用 DropDownList.Items.FindByValue 方法或遍历所有下拉列表的项目并比较值,选择正确的。
    【解决方案3】:

    您要查找的属性是 ListItem 本身的一部分,而不是众多类型的列表 - 也就是说,您可以通过在 那个项目:

    <asp:ListItem Text="Interpersonal" Value="Interpersonal" Selected="True"/>
    

    【讨论】:

    • 您不能将所选属性用于动态数据。这些项目是预定义的,但是应该选择的值来自数据库。在同一个中继器控件中,我有一个像这样的文本框:。设置它的值很容易,但 DropDownList 并非如此。
    • 您可以在每个项目上执行Eval 或不测试true(呃!),或者您可以(更体面地,我认为)从代码隐藏中设置它用逻辑阻塞 UI。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2018-03-15
    相关资源
    最近更新 更多