Extending ASP.Net Controls with Child Controls

Posted
ASP.Net Child Controls Coding VB.NET
If you've ever tried to extend an ASP.Net control that has child controls in a custom control sitting in your App_Code directory, then you know the frustration of the lack of Intellisense for those child controls. When you try to enter the correct control that should go inside your child control, you get an error saying "Element 'TableRow' is not a known element. This can occur if there is a compilation error in the Web site.

Of course, when you compile and view the page in your browser, everything is okay. What is making Visual Studio find these seemingly phantom errors?

The reason is because you are using different assemblies. When ASP.Net compiles your custom control in the App_Code directory, it puts it in its own assembly. This assembly, of course, is different from the assembly the child controls are in. Since you have not defined any child controls in your custom control, Intellisense has no idea that something can go inside that tag, and likewise the dynamic compiler will throw up errors.

You don't want to reinvent the wheel, however, by recreating those child elements. The solution? Inheritence.

Let's take an ASP Table control for example, since that's the one I've been working on for the past few days. What I wanted to do was to create a sort of wrapper around the table so that all my tables would have the same graphics without having to put the same code over and over in my .aspx files. I also added a title property, and thought about future development where I might want to create various themes for the site. This all can be done easily in a custom control.

Now, the basic child elements of the Table control are the TableRow and TableCell elements. In order to be able to use them, I must extend them in the same assembly as my Table control. Here's what I've done.

Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports Microsoft.VisualBasic

Namespace MyControls

    Public Class MyTable
        Inherits Table

        Private strTitle As String

        Public Property Title() As String
            Get
                Return strTitle
            End Get
            Set(ByVal value As String)
                strTitle = value
            End Set
        End Property

        Protected Overrides Sub Render(ByVal writer As HtmlTextWriter)
            'Do your custom writing here!
            writer.Write(strTitle)
            'Do your custom writing here!
            MyBase.Render(writer)
            'Do your custom writing here!
        End Sub

    End Class

    Public Class MyTableRow
        Inherits TableRow
    End Class

    Public Class MyTableCell
        Inherits TableCell
    End Class

End Namespace


Note that the classes for the child elements are otherwise empty. They simply inherit from the parent and that's it. Since the Table control is looking to have a TableRow inside of it, and MyTableRow inherits from TableRow, you can now use MyTableRow and Intellisense will pick it up. Same for MyTableCell. What's the .aspx look like? Load up a quick page, and put this after the Master, Page, or Control directive:

<%@ Register Namespace="MyControls" TagPrefix="mc" %>


After that, throw this anywhere in the body:

<mc:MyTable ID="tblTest" runat="server" Title="Testing MyTable" Width="100%">
    <mc:MyTableRow BackColor="Yellow">
        <mc:MyTableCell HorizontalAlign="Center">
            This table is working!
        </mc:MyTableCell>
    </mc:MyTableRow>
</mc:MyTable>


You will notice that not only do you get Intellisense for the child elements and their attributes, you also get no more errors!

Comments

Add Your Comments

roncli.com Blog
This is my blog where I give my thoughts and opinions on various topics and share my creative endeavors with the world. I run two personal blogs, but combine them here for ease of access.

Blogger - My oldest blog using the Blogger platform contains posts full of opinions, gaming, and code.

Tumblr - Tumblr posts are all about my creative side, containing music, videos, writings, and updates on my web creations.

You can select a category below to view the latest post, or browse thorugh the posts using the navigation found at the top and bottom of each post.
Categories
Coding (165)
Life (137)
Gaming (115)
Music (64)
World of Warcraft (48)
roncli.com (41)
Software (36)
Servers (29)
Hurricane Rita (27)
Six Minutes To Release (27)
Screenshot (25)
Hurricane Ike (24)
Projects (24)
Silliness (21)
Trax in Space (21)
Cent (19)
Crystal Space (15)
OSMusic.Net (14)
Blog (13)
Editorials (13)
LibWowArmory (13)
Lyrics (13)
roncli Productions (12)
VB.NET (12)
Descent (10)
LibWowAPI (10)
Descent 3 (9)
Due Process (9)
Backup (8)
CTG Music (8)
Node (8)
Six Gaming Podcast (8)
ASP.Net (7)
Buffalo (7)
League of Legends (7)
NWS (7)
Rendr (7)
SETI@Home (7)
The Nightstalker (7)
Video (7)
Azure (6)
Diablo III (6)
Hard Drives (6)
Logs (6)
Windows (6)
BOINC (5)
Cent Credits (5)
Cent Main Theme (5)
D3DSN (5)
Descent: Underground (5)
FreeBSD (5)
Google Desktop (5)
Google Earth (5)
Outpost Music (5)
Ron's Bronze Plays (5)
Sports (5)
UPS (5)
Birthday (4)
Buffalo Sabres (4)
Constellation (4)
Everytime (4)
JavaScript (4)
Overload (4)
Overload Teams League (4)
Preview (4)
Pwned Print (4)
roncli's Dumbass Award (4)
San Antonio (4)
Sigh of Excitement (4)
Six Gaming (4)
Steam (4)
Stripped Down (4)
trac (4)
Visual Studio (4)
Winamp (4)
AJAX (3)
All In My Head (3)
Blackjack (3)
Chess (3)
Crypt of the NecroDancer (3)
D3TL (3)
DCL (3)
Gate (3)
Given Up (3)
Guitar (3)
Inspiration Edit (3)
jQuery Default Button (3)
MAME (3)
MediaTagConverter (3)
ModPlug (3)
NeonXSZ (3)
NetHack (3)
Numbers (3)
Paper (3)
PHP (3)
Rawr (3)
Sift (3)
SQL Server (3)
Tumblr (3)
Twitch (3)
Vision (3)
Year in Review (3)
AM Browser (2)
Asana (2)
ASP.Net RSS Toolkit (2)
Bicycle (2)
BlizzCon (2)
Cheevos FTW! (2)
Crazy Browser (2)
DMTB (2)
Docker (2)
Elbow (2)
Eternally (2)
Evans Blue (2)
Fire In My Heart (2)
Games (2)
GTR (2)
Houston Astros (2)
How To Play (2)
Hurricane Katrina (2)
iPhone (2)
IRC (2)
IsItUp (2)
Las Vegas (2)
Legs (2)
LibBeImba (2)
Minnesota Wild (2)
Miss Driller (2)
Module Sixteen (2)
Monitor Resolution (2)
NeKo (2)
New Zepsi Industries (2)
Niagara Falls (2)
Novus Compo (2)
Pittsburgh Penguins (2)
Poker (2)
Pwned Cars (2)
Reinstall (2)
Remake (2)
Retro (2)
roncli Productions Intro (2)
San Francisco (2)
San Francisco Rush 2049 (2)
slammy (2)
Sleep (2)
Solar (2)
SoundCloud (2)
Stress (2)
Strings (2)
Tempurpedic (2)
The Editor (2)
The Observatory (2)
TNS Raw (2)
TopCoder (2)
Troupe (2)
w.bloggar (2)
Wedding (2)
XAML (2)
You (2)
Zepsi (2)
#modarchive Story 2 (1)
#occupygregstreet (1)
Absolute C++ (1)
Achaea (1)
Acronyms (1)
AdAware SW (1)
Adobe Acrobat (1)
AdventureQuest (1)
Alaska (1)
allen one (1)
AMD Settings (1)
Analyze (1)
APIs (1)
app.config (1)
Art (1)
ASSP (1)
Audiosurf (1)
Aveyond (1)
Awakening (1)
Bellaire (1)
BitTorrent (1)
Black Ox II (1)
Blackberry (1)
Blender (1)
Blogger (1)
BOINC Synergy (1)
BoincView (1)
Boom Bitches! (1)
Browserify (1)
Bullseye (1)
Byline (1)
CAD-KAS PDF Reader 2.4 (1)
CAPTCHA (1)
CDBurnerXP Pro (1)
CherryOS (1)
ChessCli (1)
Chick-Fil-A (1)
Child Controls (1)
clones (1)
ColdFusion (1)
Come Back To Me (1)
Compo (1)
Constellation Main Theme (1)
Cooking Lili (1)
Core Decision (1)
Crystal (1)
Databinding (1)
DataGrid (1)
DataGridView (1)
Deadly Drums (1)
Decade (1)
Dell (1)
Demogorgon (1)
Descent Champions Ladder (1)
Descent Rangers (1)
Diabetes (1)
Diamond Problem (1)
Doge2048 (1)
Doom's Day (1)
Double Buffer (1)
Dr. Jeffrey Masters (1)
Drama (1)
Dreamweaver (1)
Dudley's Dungeon (1)
Einstein@Home (1)
Ellon in the Dark (1)
EveryDNS (1)
Evolution (1)
Eyes (1)
Fedora Core 6 (1)
FeedPage (1)
Fiddler (1)
FlowDocument (1)
Foobar 2000 (1)
Foxit Reader (1)
Galveston (1)
Geocore (1)
GitHub (1)
GMail (1)
Google Calendar (1)
Google Chrome (1)
Google Pages (1)
Google Wave (1)
Grid (1)
grl (1)
Grooveshark (1)
Grunt (1)
GTR2 (1)
Guitar Solo (1)
Hackers (1)
HCC (1)
Hearthstone (1)
Heroes of the Storm (1)
HomesickAlien (1)
Houston Aeros (1)
ICallbackEventHandler (1)
If Paige Wins (1)
IIS (1)
Inno (1)
Internet Explorer (1)
Interview (1)
iPad (1)
Iron Chouquette (1)
Irrlicht (1)
Jaded (1)
jQuery UI (1)
jQuery UI Scroll Menu (1)
JW Player (1)
Kado Kado (1)
Kaspersky (1)
KFOS Inner Space Radio (1)
Know What (1)
Kromaia (1)
Let It Ride (1)
Let's Encrypt (1)
Let's Play (1)
LibWowHeroes (1)
LifeCast (1)
LINQ to Entities (1)
Linux (1)
Liquid Wars (1)
ListView (1)
Loading (1)
Lukan Schwigtenberg (1)
Mac (1)
MadTracker (1)
Melbourne (1)
Melt (1)
Message From Beyond (1)
Micro Center (1)
Mistakes (1)
Monitor (1)
Mouse (1)
Mr. Driller (1)
MSDN (1)
NASCAR SimRacing (1)
Network (1)
New Year (1)
olmod (1)
On Fire Series (1)
Opalus Factory (1)
Open Labs (1)
Open Source (1)
Operation Payback (1)
Overwatch (1)
PearPC (1)
Phony (1)
Piano (1)
Pingle (1)
pogo.com (1)
PowerStrip (1)
Programming (1)
PSP (1)
PXO (1)
Quadra (1)
Radeon (1)
Radio Shack (1)
Rant (1)
RedHeat (1)
Reject (1)
Release (1)
Religion (1)
Rendr Template (1)
Renegade (1)
Retrovirus (1)
RIP (1)
RockMelt (1)
Scott Hanselman (1)
Self-Destruct Sequence Podcast (1)
Showsan (1)
Silverlight (1)
Sitemap Generator (1)
Smoke (1)
Sol Contingency (1)
Sound Blaster Audigy (1)
Speedrun (1)
Spelling (1)
SQL Reporting Services (1)
SSL Certificates (1)
Stanley Jakubowitz (1)
Starbase Arcade (1)
Starcraft II (1)
Starting All Over (1)
Story (1)
Sublevel Zero (1)
Swiss (1)
Thanksgiving (1)
The Crossroads (1)
The Time Now (1)
The Wight to Remain (1)
Time and Date (1)
Toronto (1)
Torrent Keeper (1)
Total Bollocks (1)
Trans-Siberian Orchestra (1)
TraxSurf (1)
Trillian (1)
Typing (1)
Ultimate Boot CD (1)
UpdatePanel (1)
US Interactive (1)
Video Bob (1)
ViewState (1)
Vince Young (1)
Vincent Lau (1)
Vocals (1)
Voyage (1)
Walter Savitch (1)
Warlords of Draenor (1)
Weather (1)
Westward (1)
What Do I Know (1)
WikiLeaks (1)
Windows Defender (1)
winLAME (1)
Winter Classic (1)
Word Field (1)
World Record (1)
Worst Things in the World (1)
WPF (1)
Xamarian (1)
XBox (1)
XM Radio (1)
XML Web Services (1)
Yahoo! Pipes (1)
Yes (1)
You Are Not Alone (1)
Share This Page
Join roncli on Discord!
Join the roncli Gaming Discord server for discussion about gaming, development, and more!
roncli.com Media Player