开发者

VB.Net ASP: Access controls in a user control

开发者 https://www.devze.com 2023-02-08 20:44 出处:网络
I have a couple user controls that are loaded by a Select Case statement.However, in the behind code file for the main page that loads these controls, none of the asp controls show up in intellisense.

I have a couple user controls that are loaded by a Select Case statement. However, in the behind code file for the main page that loads these controls, none of the asp controls show up in intellisense. I had a feeling it's because the controls are loaded conditionally. My question is what is the best way to solve this?

1) Load the controls and do a Select Case in the behind code to make them hidden or not.

2) Is there a way to say (psuedocode): LoadUserControl("UserControl1").Controls("tbTest").Text = ""

3) How can I pass a dataset to the Use开发者_JAVA技巧r Control file?

4) Any other ideas?

Thanks.

Update

This allows me to load the control and access values in the sub-controls. However, the update doesn't seem to work. Any ideas?

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


If you know what Controls will be displayed you can ctype them to your control

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

and your MyUserControl could have some properties, that you might want to set

MyUserControl.Data = mySelectedData

If you dont same controls, you might consider using interfaces

Public Interface IDataForUserControl
    Public Property Data as Object
End Interface

Then you can implement this Interface, and if you load it, you could try cast it into the interface.

If you dont have these two possibilities, you could work with ITemplates and NamingContainers.

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

Than you could in your UserControl1 access the Data using DataBinder.

Answer for your Update

There might be some overriding somewhere. When are you calling your update function? Maybe the mintues.ascx is setting the same data on "load" event or something.

You could either create a method in the "userControl" that you would access in the SetFrequencyValues method, and then it may not be touched anymore. Or you handle some event of your usercontrol

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

Or on prerender, what ever you want.

0

精彩评论

暂无评论...
验证码 换一张
取 消