views:

436

answers:

2

In my .aspx page I have;

    <%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" AspCompat="True" %>

    <%@ Register src="Modules/Content.ascx" tagname="Content" tagprefix="uc1" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
    <html xmlns="http://www.w3.org/1999/xhtml"&gt;
    <head runat="server">
    <title></title>
    </head>
    <body>
    <form id="form1" runat="server">
        <div>
        <asp:PlaceHolder ID="Modulecontainer" runat="server"></asp:PlaceHolder>
        </div>
        </form>
    </body>  
</html>

In my aspx.vb I have;

    Try
        Dim loadmodule As UserControl
        loadmodule = Me.LoadControl("~/modules/content.ascx")
        Modulecontainer.Controls.Add(loadmodule)
    Catch ex As Exception
        Response.Write(ex.ToString & "<br />")
    End Try

The result is an empty placeholder and no errors.

Thanks a lot for any assistance

P.S after Fat_Tony's answer I changed the code to;

Try
            Dim loadmodule As ASP.ContentModule
            loadmodule = CType(LoadControl("~\Modules\Content.ascx"), ASP.ContentModule)
            Modulecontainer.Controls.Add(loadmodule)
        Catch ex As Exception
            Response.Write(ex.ToString & "<br />")
        End Try

But still no results unfortunately.

+1  A: 

I don't know VB too well, but don't you need to declare the control to be a UserControl and not just Control? e.g. Try changing

Dim loadmodule As Control

To

Dim loadmodule As UserControl
Dan Diplo
Thanks Dan. Unfortunately after changing to UserControl it did'nt seem to make a difference.
Phil
+1  A: 

Rather than declaring your UserControl as type "Control", declare it as the Class Name you specified in your UserControl.ascx file:

<%@ Control className="MyUserControl" %>

So in your code-behind on the .aspx page:

Dim objControl as ASP.MyUserControl = CType(LoadControl("~\Controls\MyUserControl.ascx"), ASP.MyUserControl)

More info available on MSDN.

EDIT: Check the code-behind file for your user control and take note of the namespace and class name that are in there. When I created my user control, it was automatically added to a namespace which contained the folder name as well as the application namespace.

Then, in your .aspx.vb, replace "ASP.ContentModule" with "Namespace.ClassName" from your .ascx.vb file. Also, make sure you're still calling the Add method on your placeholder.

My example's in C# but I can put up in vb if you need. My application was conveniently named "Tester".

ASCX code-behind:

namespace Tester.modules
{
    public partial class content : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
    }
}

ASPX code-behind:

namespace Tester
{
    public partial class _Default : System.Web.UI.Page
    {   
        private Namespace.ClassName loadmodule;
        protected void Page_Load(object sender, EventArgs e)
        {
            loadmodule = (Namespace.ClassName)LoadControl("~/modules/content.ascx");
            Modulecontainer.Controls.Add(loadmodule);
        }
    }
}
fat_tony
Thanks, I've moved the loadmodule declaration outside the page_load and changed to <%@ Reference Control="~/modules/content.ascx" %> and have added ClassName="ContentModule" to the user control but still no results unfortunately.
Phil
Just out of curiosity, does the user control work properly if you declare it on the page normally? I.e. <ucl:Content id="uclContent" runat="server" />. Don't forget to change back to @Register for this.
fat_tony
yep i can put it in manually no probs.
Phil
I think the problem may be more complex. I now have the usercontrol being loaded but still no content within. Your solution worked though.
Phil
Okay, I've knocked up a quick app that does the same and it seems to work. I've edited my post above to include what I've done.
fat_tony
Sounds like the problem's now more to do with the load event on the user control. Easy to test by adding a static <p> tag to the control, see if it's rendered on the aspx page.
fat_tony
It is rendered ok. And I have a page_load in both the aspx and the ascx.vb... i think this is the problem
Phil
Why don't you try creating a public method in your ascx.vb and call that from the Page_Load event in the aspx.vb?
fat_tony
That worked, thanks!
Phil