Ted pottel
Ted pottel

Reputation: 6983

Can you access objects by using their names as a string, instead of a object?

I don't know if I explained this in my title, this is what i want to do.
(In VB on a active server page)
I have 5 buttons called but1.....but2.
Right now I have the following code to make them invisible

but1.Visible=false;
but2.Visible=false;
but3.Visible=false;
but4.Visible=false;
but5.Visible=false,

Is there a way to access the objects by using a string, example

for(i=i;i<6;i++
       items("but"+str(i)).visible=false

Upvotes: 0

Views: 87

Answers (1)

Tim Schmelter
Tim Schmelter

Reputation: 460238

Put them in a container control like an ASP.NET Panel that is rendered as a DIV when they have a similar meaning:

   <asp:Panel id="Panel1" runat="server" CssClass="ButtonPanel">
       <asp:TextBox id="Txt1" runat="server" />
       <asp:Button id="Btn1" Text="click me" OnClick="Button_Click" runat="server"/><br />
       <asp:TextBox id="Txt2" runat="server" />
       <asp:Button id="Btn2" Text="click me" OnClick="Button_Click" runat="server"/><br />
       <asp:TextBox id="Txt3" runat="server" />
       <asp:Button id="Btn3" Text="click me" OnClick="Button_Click" runat="server"/>
   </asp:Panel>

Then you can find and loop them in this way:

Dim allPanelButtons = Panel1.Controls.OfType(Of Button)()
For Each btn In allPanelButtons 
    btn.Visible = False
Next

OfType would also work on the whole page, but not when they're nested in child controls(like GridView).

Your question is a bit unclear, of course you can reference controls by their name(actually the ID)directly when they're added declaratively to the page's ControlCollection:

Btn1.Visible = False

And yes, it works also to search them by id, but i don't recommend this approach because it's not fail-safe and can cause future problems that happen only on runtime. So just for the sake of completeness:

For i = 1 To 6
    Dim control = FindControl("Btn" & i)
    If control IsNot Nothing AndAlso TypeOf control Is Button Then
        control.Visible = False
    End If
Next

Upvotes: 2

Related Questions