如何在按钮单击上更改动态创建的下拉列表的选定项目

时间:2012-04-10 09:10:06

标签: asp.net vb.net drop-down-menu postback

我必须在页面上隐藏我可以使用JavaScript触发的按钮(__dopostback ...) 我的页面上还有一个对象列表和一个下拉列表,用户可以在页面上对这些对象进行排序。

我的代码检查列表的Databind上的下拉列表的当前值,并将选择的排序方法应用于列表。

当用户从列表中选择了另一种排序方法时,将触发第一个按钮。

当用户将新项目添加到列表时,将触发第二个按钮。 Sortmethod" sort2"如果发生这种情况,应该在下拉列表中自动设置。

因此,当单击第二个按钮时,我需要动态设置下拉列表的选定项目,以便稍后在下拉列表的DataBind方法中检查所选值的值,并知道应该应用哪种排序方法。

我希望它能以某种方式清楚,所以你可以帮助我。我没有成功动态更改所选值。

我使用控件:首先是objects.vb,第二个是ObjectContainer.vb Objects.vb包含两个按钮,下拉列表和objectcontainer的实例。 objectcontainer包含具有对象的列表,这些对象需要根据在对象控件中选择的值进行排序。

Objects.vb:

Private sortMethod As DropdownList
Private container as ObjectContainer

Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
                MyBase.OnInit(e)
                EnsureChildControls()  
 End Sub

Protected Overrides Sub CreateChildControls()
        MyBase.CreateChildControls()

        ' Add sorting
        sortMethod = New DropDownList()
        sortMethod.ID = "sortlist"

        CType(sortMethod.Items, IStateManager).TrackViewState()

        If Not Page.IsPostBack Then
            Dim sort1 As New ListItem()
            sort1.Text = "Sort Method 1"
            sort1.Value = "sort1"
            Dim sort2 As New ListItem()
            sort2.Text = "Sort Method 2"
            sort2.Value = "sort2"
            Dim sort3 As New ListItem()
            sort3.Text = "Sort Method 3"
            sort3.Value = "sort3"       

            sortMethod.Items.Add(sort1)
            sortMethod.Items.Add(sort2)
            sortMethod.Items.Add(sort3)

            sortMethod.AutoPostBack = False
            sortMethod.EnableViewState = True

            sortMethod.Attributes.Add("onchange", "javascript:TriggerPostbackButtonUpdate()")
        End If

        Me.Controls.Add(sortMethod)

container = New ObjectContainer
            container.ID = "oc"

            Me.Controls.Add(container)

    End Sub

        Protected Sub ButtonUpdate_Click(ByVal sender As Object, ByVal e As System.EventArgs)
            container.SortMethodAndOrder = sortMethod.SelectedValue
            container.DataBind()
        End Sub

            'when this event is triggered, the "sort2" item should be selected after the postback
        Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs)                
            sortMethod.SelectedIndex = sortMethod.Items.IndexOf(sortMethod.Items.FindByValue("sort2"))    
            container.SortMethodAndOrder = "sort2"
            container.DataBind()
        End Sub

ObjectContainer.vb:

Public Overloads Overrides Sub DataBind()

        EnsureChildControls()

        Dim objects As ObjectsCollection = Nothing


        If objects.Count <> 0 Then


            Dim sortList As DropDownList = DirectCast(Me.Parent.FindControl("sortlist"), DropDownList)
            If sortList IsNot Nothing Then

               'sort based on the selected value in the dropdownlist

            End If

        End If
  End Sub

我可以提供您需要的任何信息来帮助我。我真的很感谢你的时间,所以非常感谢你花了一些时间来阅读这篇文章!

2 个答案:

答案 0 :(得分:1)

我没有理由在您的代码中手动调用TrackViewState。 有没有具体的理由来称呼它?否则,我会删除它。

不知道这是否有任何帮助,但我倾向于使用以下两行(作为C#用户,但我认为它没有任何区别):

sortMethod.ClearSelection()
sortMethod.Items.FindByValue("sort2").Selected = true

而不是:

sortMethod.SelectedIndex = sortMethod.Items.IndexOf(sortMethod.Items.FindByValue("sort2"))

答案 1 :(得分:0)

以下是id如何使用jquery在触发回发之前设置下拉列表的选定值。

 $(".myDropDownList").val("sort2");
 __doPostBack(uniqueIdOfMyButton,'');