0

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

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

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

当用户向列表中添加新项目时,会触发第二个按钮。如果发生这种情况,应该在下拉列表中自动设置排序方法“sort2”。

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

我希望它有点清楚,所以你可以在这里帮助我。我没有成功动态地更改所选值。

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

对象.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

对象容器.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

我可以提供您需要的任何信息来帮助我。我非常感谢您抽出宝贵的时间,非常感谢您花时间阅读本文!

4

2 回答 2

1

我看不出有理由在您的代码中手动调用 TrackViewState。有特定的理由来调用它吗?否则,我会删除它。

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

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

代替 :

sortMethod.SelectedIndex = sortMethod.Items.IndexOf(sortMethod.Items.FindByValue("sort2"))
于 2012-04-10T11:33:29.500 回答
0

这是 id 在触发回发之前使用 jquery 设置下拉列表的选定值的方法。

 $(".myDropDownList").val("sort2");
 __doPostBack(uniqueIdOfMyButton,'');
于 2012-04-11T06:55:07.040 回答