Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsFree MagazinesWhite PapersSubmit Content
Discussion GroupsASP.NETWindows FormsLanguages.NET FrameworkVisual Studio.NET
Articles.NET FrameworkASP.NETToolsWindows Forms
.NET DirectoryOpen Source ProjectsUser GroupsWeb Resources
Related Topics
Visual Basic 6SQL ServerMS AccessOther DB ProductsMS Server ProductsMore Topics ...

.NET Forum / ASP.NET / Web Controls / March 2008

Tip: Looking for answers? Try searching our database.

Custom Control, ITemplate and nested bound controls

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Brook - 17 Mar 2008 16:05 GMT
Hi Everyone,

I've been interested in creating a custom control that wraps up a few common
UI elements and some styling. But, in order to make this earier to
understand, let's say my control is just a posh panel. It has curvy edges
rather than straight ones.

Now i have written a custom control which allows me to do the following in
aspx code :

       <cc1:CurvyPanel runat="server">
           <Content>
               <asp:Label runat="server" Text="Hello World!"></asp:Label>
           </Content>
       </cc1:CurvyPanel>

The control is visible at runtime and design time.

However, when i try something a little more adventurous such as:

        <cc1:CurvyPanel runat="server">
           <Content>
                   <asp:Repeater ID="rptYears" runat="server">
                       <ItemTemplate>
                              <a href="<%#Eval("link") %>"><%# Eval("name")
%></a>
                       </ItemTemplate>
                   </asp:Repeater>
            </Content>
         </cc1:CurbyPanel>

Now, when i try to bind some data to my embedded repeater from my parent
page, it gives me the error

"InvalidOperationException was unhandled by user code
Databinding methods such as Eval(), XPath(), and Bind() can only be used in
the context of a databound control."

So, I was hoping my "curvypanel" would behave in the same way as a normal
.NET panel in terms of allowing content inside it to be independantly bound
to a set of data... so either it doesn't allow this or ive done something
wrong.

Can anyone help me by clarifying whether what im trying to do is possible?
and if so, provide any input on how to go about it? :)

thanks,
Andrew
Peter Bucher [MVP] - 17 Mar 2008 23:23 GMT
Hello Andrew

> "InvalidOperationException was unhandled by user code
> Databinding methods such as Eval(), XPath(), and Bind() can only be used
> in
> the context of a databound control."
Look what google says about that error message.

I guess, its for the reason, that your control doesnt represent a databound
control.
Anyway, that should work:

<%#DataBinder.Eval(Container.DataItem, "field").ToString()%>

Signature

Gruss, Peter Bucher
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
http://www.aspnetzone.de/blogs/peterbucher/ - Auf den Spuren von .NET

Brook - 18 Mar 2008 16:40 GMT
Thanks Peter - i made the changes and the control no longer throws the error.
In fact the control works in every way i'd expect.

The only thing that i wonder about now, is why my control is different to
say a normal asp:panel. Does an asp:panel perhaps inherit from some classes
that allow child controls to bind to their data sources using Eval?  
Afterall, i don't want to bind any data to my control, i want to bind to the
child controls that get added into the controls ITemplate

At the moment, my custom control is inheriting from WebControl, and
implementing INamingContainer

thanks,
Andrew

> Hello Andrew
>
[quoted text clipped - 9 lines]
>
> <%#DataBinder.Eval(Container.DataItem, "field").ToString()%>
Teemu Keiski - 20 Mar 2008 22:40 GMT
"Databinding methods such as Eval(), XPath(), and Bind() can only be used in
the context of a databound control"

Sounds familiar error to me. ;-)

How's the template's instantiation in the control - regarding how it gets
added to Controls collection? And is template container specified
(TemplateContainer attribute)?

Signature

Teemu Keiski
AspInsider, ASP.NET MVP
http://blogs.aspadvice.com/joteke
http://teemukeiski.net

> Hello Andrew
>
[quoted text clipped - 9 lines]
>
> <%#DataBinder.Eval(Container.DataItem, "field").ToString()%>
Brook - 25 Mar 2008 15:55 GMT
Hi - i think this is the code you're interested in seeing :-

       private ITemplate _PanelContent;

       private PlaceHolder phContent = new PlaceHolder();

       [PersistenceMode(PersistenceMode.InnerProperty),
       TemplateInstance(TemplateInstance.Single),
       TemplateContainer(typeof(TemplateControl))]
       public ITemplate Content
       {
           get { return _PanelContent; }
           set { _PanelContent = value; }
       }

       protected override void OnInit(EventArgs e)
       {
           base.OnInit(e);
           if (_PanelContent != null)
           {

               _PanelContent.InstantiateIn(phContent);
           }
           EnsureChildControls();
       }

thanks,
Andrew

> "Databinding methods such as Eval(), XPath(), and Bind() can only be used in
> the context of a databound control"
[quoted text clipped - 18 lines]
> >
> > <%#DataBinder.Eval(Container.DataItem, "field").ToString()%>

Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.