0

我正在尝试设置一个中继器,该中继器具有下拉菜单,这些下拉菜单的值是在使用 linq 从数据库填充的数组绑定数据时选择的。

我遇到的问题是每个下拉列表在渲染时都具有相同的选定值,这也恰好是数组中的最后一个值。我需要每个选定的值与它的标签相对应,该标签存储在先前提交的表中。

func.ConfigurePastClientSetting(label.Text, krmid) 返回一个值,该值等于 ddl 内部的值之一,该值已从过去的表单提交存储在数据库中。

Private Sub rptDropDownInfo_ItemDataBound(sender As Object, 
                e As System.Web.UI.WebControls.RepeaterItemEventArgs) _
                Handles rptDropDownInfo.ItemDataBound
Dim selected As New List(Of String)
If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
        Dim ddl As DropDownList = e.Item.FindControl("ddlEloquaValues")
        Dim column As EbmsColumnLabel = DirectCast(e.Item.DataItem, EbmsColumnLabel)
        ddl.Items.AddRange(ddlELQ.Items.OfType(Of ListItem)().ToArray())
        ddl.ClearSelection()
        ddl.Items.FindByValue(func.ConfigurePastClientSetting(column.displayname, krmid)).Selected = True
selected.Add(ddl.SelectedItem.Value)
    End If
End Sub

如果我删除 ddl.ClearSelection 我会得到一个“下拉列表错误中不能有多个选定值。这是标记:

 <asp:Repeater ID="rptDropDownInfo" runat="server">
                <HeaderTemplate><table><tr><td style="width:60px;padding-left:20px;">KRM</td><td></td><td>Eloqua</td></tr></table></HeaderTemplate>
                <ItemTemplate>
                <tr>
                    <asp:Label ID="lblColumnNames" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "DisplayName") %>'></asp:Label><td>map to</td>
                        <asp:DropDownList ID="ddlEloquaValues" runat="server">
                        </asp:DropDownList>
                    <td>
                        <asp:Label ID="lblWarningLabels" runat="server" Text=""></asp:Label></td></tr>
                </ItemTemplate>
                </asp:Repeater>

我尝试检查 first(0) ddl.SelectedValue 并得到数组中的最后一项:

Private Sub Page_PreRender(sender As Object, e As System.EventArgs) Handles Me.PreRender
    If IsPostBack Then
        Dim ddl As DropDownList = rptDropDownInfo.Items(0).FindControl("ddlEloquaValues")
        Dim check = ddl.SelectedItem.Value
    End If
End Sub
4

1 回答 1

0

似乎您所有的 DDL 都共享相同的 ListItems 实例。

因此,在项目上设置 Selected=true 会为共享它的所有 DDL 选择它。这也是您在删除 ClearSelection 时遇到问题的原因

您应该创建新的 ListItems,例如让您的 Linq 查询通过 Select 实例化新的 ListItems,而不是返回现有的 ListItems)

希望这会有所帮助。

ddl.Items.AddRange(ddlELQ.Items.OfType(Of ListItem)().ToArray())
ddl.Items.FindByValue(func.ConfigurePastClientSetting(column.displayname, krmid)).Selected = True

selected.Add(ddl.SelectedItem.Value)

应该是(对不起,C# 语法):

ddl.Items.AddRange(ddlELQ.OfType<ListItem>().Select(li=>new ListItem(){Text = li.Text,Value = li.Value}).ToArray())
ddl.SelectedIndex = ddl.Items.IndexOf(ddl.Items.FindByValue(func.ConfigurePastClientSetting(column.displayname, krmid)));

如果你想防止多重绑定,你应该删除 ClearSelection(),用 ddl.Items.Clear() 替换它。

于 2012-09-26T09:31:16.343 回答