VB.Net ASP:用户控件中的访问控件

时间:2011-02-07 16:26:43

标签: asp.net vb.net user-controls

我有一些由Select Case语句加载的用户控件。但是,在加载这些控件的主页的后台代码文件中,没有任何asp控件出现在intellisense中。我有一种感觉,因为控件是有条件加载的。我的问题是解决这个问题的最佳方法是什么?

1)加载控件并在后面的代码中执行Select Case以隐藏它们。

2)有没有办法说(psuedocode):LoadUserControl("UserControl1").Controls("tbTest").Text = ""

3)如何将数据集传递给用户控制文件?

4)还有其他想法吗?

感谢。

更新

这允许我在子控件中加载控件和访问值。但是,更新似乎不起作用。有什么想法吗?

Private Sub SetFrequencyValues(ByVal frequency As Integer)
    Select Case frequency
        Case 2
            Dim userControl As Minutes = CType(LoadControl("Frequency/Minutes.ascx"), Minutes)
            Dim tb As TextBox = userControl.FindControl("tbMinutes")
            tb.Text = "10"
            tb.Visible = False
        Case(4)
        Case 5
        Case 6
    End Select
End Sub

1 个答案:

答案 0 :(得分:1)

如果您知道将显示哪些控件,您可以将其键入控件

dim uc as MyUserControl = cType(LoadUserControl("UserControl1"), MyUserControl)

并且您的MyUserControl可能有一些您可能想要设置的属性

MyUserControl.Data = mySelectedData

如果你没有相同的控件,你可以考虑使用接口

Public Interface IDataForUserControl
    Public Property Data as Object
End Interface

然后你可以实现这个接口,如果加载它,你可以尝试将它转换为接口。

如果您没有这两种可能性,可以使用ITemplates和NamingContainers。

Dim control as new MyNamingContainerThatImplementsIDataItem
LoadTemplate("UserControl1").instantiateIn(control)

您可以在UserControl1中使用DataBinder访问数据。

回复您的更新

某处可能有一些压倒一切。你什么时候打电话给你的更新功能?也许mintues.ascx在“加载”事件或类似事件上设置相同的数据。

您可以在“userControl”中创建一个您将在SetFrequencyValues方法中访问的方法,然后它可能不再被触摸。或者您处理用户控件的某些事件

dim userCOntrol as Minutes = Loadcontrol("Minutes.ascx")
AddHandler userControl.load, sub(sender as Minutes, e as eventargs)
                                  sender.mytextbox.text = "10"
                             end sub

或者预渲染,你想要什么。