ASP .NET Dropdownlist.Selectedvalue不会更新迭代动态创建的控件

时间:2013-05-12 00:52:22

标签: .net dynamic drop-down-menu selectedvalue

我在动态创建的下拉列表控件中没有更新时,selectvalue属性出现问题:

我有一个ctlProductosFormatos类型的自定义控件,其中包含一个组合和其他控件。我在其他地方动态创建这个自定义控件,然后我遍历动态创建的控件中的所有组合,更新它们上的项目列表,从另一个虚拟下拉列表中复制我想要的值。

此代码中的控件是向右迭代的,组合也是正确填充的。我的问题是,我希望将每个组合上的selectedvalue维持在与项目更新之前相同的值,但是这会失败。

如果我单步执行代码并仅运行第一个组合的迭代,并跳转到循环外,此组合正确填充并具有正确的选定值,但如果我运行完整循环,则所有组合都已设置与最后一个组合具有相同的值,所以我认为这与我为所有迭代实例化相同控件之类的东西有关,但似乎不是我的代码中的那个。

    Dim ControlFormato As ctlProductosFormatos
    ' Iterates through custom controls collection, IEnumerable(Of ctlProductosFormatos)
    For Each ControlFormato In Controles
        ' Get the dropdownlist inside the current custom control
        Dim ControlComboFind As Control = ControlFormato.FindControl("cmbFotoFormato")
        Dim ControlCombo As DropDownList = CType(ControlComboFind, DropDownList)
        ' Get the currently selected value in the dropdownlist
        Dim ValorSeleccionado As String = ControlCombo.SelectedValue

        ' Clear the items in the current combo,and fills with the ones in a dummy combo
        ControlCombo.Items.Clear()
        ControlCombo.Items.AddRange(ComboPatron.Items.OfType(Of ListItem)().ToArray())

        ' Sets the current combo selected item with the previously saved one
        ControlCombo.SelectedValue = ValorSeleccionado
    Next

2 个答案:

答案 0 :(得分:1)

问题是ViewState。如果你动态修改DropDownList()中的项目,它的ViewState将不会被更新,所以当你回发值时,框架将在控件的ViewState内部发送值,但是值将是mising,因此SelectedValue属性不会被设定。如果你想使用发布的值,那么从Request.Form [ddlName.ClientID]获取它们(我不确定ClientID将是正确的索引,但主要的想法是这样)。

答案 1 :(得分:0)

正如我在彼得的评论中所写,问题出现在组合项目重复中,表现为“共享项目”。我为这个最丑陋和更长的代码替换了复制行,问题解决了。希望它有所帮助。

    ' Clear the items in the current combo,and fills with the ones in a dummy combo
    ControlCombo.Items.Clear()
    ' THIS LINE HAS BEEN COMMENTED AND REPLACED FOR THE FOLLOWING CODE
    ' ControlCombo.Items.AddRange(ComboPatron.Items.OfType(Of ListItem)().ToArray())

        Dim LSource As ListItem
        Dim LDestination As ListItem
        For i = 0 To ComboPatron.Items.Count - 1
            LSource = ComboPatron.Items(i)
            LDestination = New ListItem(LSource.Text, LSource.Value)
            ControlCombo.Items.Add(LDestination)
        Next