ASP.NET Dropdownlist.Selectedvalue不通过动态创建的控件进行迭代更新

ASP.NET Dropdownlist.Selectedvalue不通过动态创建的控件进行迭代更新,.net,dynamic,drop-down-menu,selectedvalue,.net,Dynamic,Drop Down Menu,Selectedvalue,动态创建的dropdownlist控件中的selectedvalue属性有问题,无法更新: 我有一个ctlProductosFormatos类型的自定义控件,其中包含一个组合和其他控件。我在其他地方动态创建这个自定义控件,然后迭代动态创建的控件中的所有组合,用我想要的值从另一个虚拟dropdownlist复制更新它们上的项列表 这段代码中的控件被正确迭代,组合也被正确填充。我的问题是,我想将每个组合上的selectedvalue保持在项目更新之前的相同值,但这失败了 如果我在代码中只运行第一个组

动态创建的dropdownlist控件中的selectedvalue属性有问题,无法更新:

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

这段代码中的控件被正确迭代,组合也被正确填充。我的问题是,我想将每个组合上的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

问题在于ViewState。如果动态修改DropDownList()中的项目,则其ViewState不会更新,因此当您发回值时,框架将在控件的ViewState中查看发送的值,但该值将出错,因此不会设置SelectedValue属性。如果要使用发布的值,请从Request.Form[ddlName.ClientID]获取它们(我不确定ClientID是否是正确的索引,但主要思想是这样的)。

问题在于视图状态。如果动态修改DropDownList()中的项目,则其ViewState不会更新,因此当您发回值时,框架将在控件的ViewState中查看发送的值,但该值将出错,因此不会设置SelectedValue属性。如果您想使用发布的值,请从Request.Form[ddlName.ClientID]获取它们(我不确定ClientID是否是正确的索引,但主要思想是这样的)。

正如我在Peter的评论中所写,问题在于组合项的重复,其行为类似于“共享项”。我为这段最难看、最长的代码替换了复制行,问题就解决了。希望能有帮助

    ' 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

正如我在Peter的评论中所写的,问题在于组合项目的重复,即类似于“共享项目”的行为。我为这段最难看、最长的代码替换了复制行,问题就解决了。希望能有帮助

    ' 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

感谢您提供的提示,但问题与此无关,因为如果我只处理一个元素就中断了循环,则处理的项目工作正常。我终于明白了问题出在组合复制方法上。似乎项目是使用此方法在组合之间共享的,更改其中一个组合中的selectedvalue会影响其他组合。我发布解决问题的更改。无论如何,谢谢你的思考;)感谢您提供的提示,但问题与此无关,因为如果我只处理一个元素就中断了循环,则处理的项目工作正常。我终于明白了问题出在组合复制方法上。似乎项目是使用此方法在组合之间共享的,更改其中一个组合中的selectedvalue会影响其他组合。我发布解决问题的更改。无论如何,谢谢你的思考;)