【问题标题】:Setting SelectedValue in DropDownList inside Repeater在Repeater内的DropDownList中设置SelectedValue
【发布时间】:2013-12-26 17:48:25
【问题描述】:

我完成这项工作的方式太丑陋了,所以我知道我一定遗漏了一些东西.. 告诉我如何更好地设置 DDL 的 SelectedValue。 我尝试在 DropDownList 标记中设置 SelectedValue,并在 OnDataBound 事件中使用 Eval("b.codeID"),这给了我一个“只能使用 Eval()、XPath() 和 Bind() 等数据绑定方法在数据绑定控件的上下文中。”错误。 下面的代码是现在有效的。我不喜欢它是必须将一个 asp:Label 绑定到 b.CatID 只是为了在 OnDataBound 事件中引用它以在 For Each 循环中使用它。我应该能够以更优雅的方式获取 eval("b.CodeID") 的值。

<asp:Repeater ID="rptLabor" runat="server" OnItemCommand="button_click" OnItemDataBound="rptLaborDataBound">
 <td><asp:DropDownList ID="ddlLaborCodeEdit" runat="server"></asp:DropDownList>
 <asp:Label ID="lblddlLaborCodeEdit" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "b.catid")%>' Visible="false"></asp:Label></td>

Sub rptLaborDataBound(ByVal s As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs)
    If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then
        Dim ddlLaborCode As DropDownList = CType(e.Item.FindControl("ddlLaborCodeEdit"), DropDownList)
        Dim lblLaborCode As Label = CType(e.Item.FindControl("lblddlLaborCodeEdit"), Label)

            SetddlLaborBillCode(ddlLaborCode)


        For Each item As System.Web.UI.WebControls.ListItem In ddlLaborCode.Items
            If item.Value = lblLaborCode.Text Then
                item.Selected = True
                Exit For
            End If
        Next

Protected Sub SetddlLaborBillCode(ByVal ddl As DropDownList)
    Dim db As New TtCSIDataContext
    Dim sel = (From a In db.tblBillCodesByClients _
              Where a.ClientID = ddlClient.Text And a.Grp = "LAB" _
              Select a.CodeID, Code = a.Code & " | " & a.CodeDescr).ToList

    ddl.DataSource = sel
    ddl.DataTextField = "Code"
    ddl.DataValueField = "CodeID"
    ddl.DataBind()
End Sub

【问题讨论】:

    标签: asp.net vb.net


    【解决方案1】:

    我明白你现在所说的关于从标记绑定的问题。好吧,希望我至少可以帮助您清理当前的方法。

    我删除了标签,然后从 ItemDataBound 事件中的e.Item.DataItem 属性中获取“b.catid”的值。

    此外,由于您确信“b.catid”的值将出现在 DropDownList 的值列表中,因此您可以直接设置 SelectedValue(而不是循环遍历项目)。

    标记:

    <asp:Repeater ID="rptLabor" runat="server" OnItemCommand="button_click" 
        OnItemDataBound="rptLaborDataBound">
        <td>
            <asp:DropDownList ID="ddlLaborCodeEdit" runat="server">
            </asp:DropDownList>
        </td>
    

    VB.NET 代码:

    Sub rptLaborDataBound(ByVal s As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs)
    
        If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then
            Dim ddlLaborCode As DropDownList = CType(e.Item.FindControl("ddlLaborCodeEdit"), DropDownList)
            Dim catIDCode As String = CType(e.Item.DataItem("b.catid"), String)
    
            SetddlLaborBillCode(ddlLaborCode)       
            ddlLaborCode.SelectedValue = catIDCode
    
        ...
    

    【讨论】:

    • 您会这么认为,但由于下拉列表直到中继器 OnDataBound 事件才获得数据绑定,所以我得到“'ddlLaborCodeEdit' 的 SelectedValue 无效,因为它不存在于项目列表中.参数名称:值”错误
    • 啊,我的坏@Paul。我已经用一些希望更清洁的东西更新了我的答案。它使用e.Item.DataItem 属性,您可以使用它来获取绑定到此RepeaterItem 的“后端”值。
    • @Paul 我很困惑的一件事是:您的问题正文提到了“b.codeID”,但代码仅引用了“b.catid”。您可以使用 DataItem 对象来获取任一值,但我坚持使用“b.catid”,因为这已经在您的代码中了。
    • 这没有用,但让我走上了正确的轨道... Dim catIDCode As String = CType(e.Item.DataItem("b.catid"), String) 抛出“无默认值”找到类型“VB$AnonymousType_10”错误的成员。但是“Dim catIDCode As String = DataBinder.Eval(e.Item.DataItem, "b.catid")”按预期工作。谢谢
    • 很高兴能帮上忙!我很少使用 VB.NET,但我想知道是否只是不稳定的字符串转换首先导致了错误。如果你做了Dim catIDCode As String = e.Item.DataItem("b.catid").ToString() 怎么办?我只是不希望您必须在代码隐藏中使用DataBinder.Eval(我从来没有)。
    猜你喜欢
    • 2013-05-23
    • 2012-09-06
    • 1970-01-01
    • 2010-11-28
    • 2013-08-14
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多