Board index » Web Programming » unable to access User Control data HELP

unable to access User Control data HELP

Web Programming266
All,



myself and another developer have been staring blankly at a screen for

the past 48 hours and are wondering just what stunningly obvious thing

we are missing.



We are trying to load up 2 or more user controls dynamically by adding

to a placeholder defined in page_load. I've included the sample code

for how we are accessing one. The user controls are not rocket science

- just a few text boxes with public accessor properties. We've trawled

through all the newsgroups and have:



(1) declared class scope variables that are visible throughout the

class

(2) declared the User Controls outside of an isPostBack check so they

are always created

(3) defined public get and set methods in each user control to the

container page can access the data.

(4) we have made sure that we are casting object to the correct type

coming in and out of the Placeholder collection



when we build and step through we find that when we enter the

onClick() function if we try to access the placeholder collection, we

get an IndexOutOfBounds exception - the collection has NO ELEMENTS ANY

MORE!!! If we try to access the User Control by means of it's class

scope variable we get a NullReference Exception.





what are we missing - this is driving us nuts......



sample code to follow,



many thanks



Paul.









namespace local.NewReg

{

//all our usings

using System;

using System.Collections;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Web;

using System.Web.SessionState;

using System.Web.UI;



/// <summary>

/// Summary description for registration.

/// </summary>

public class registration : System.Web.UI.Page

{



//class scope placeholder

protected System.Web.UI.WebControls.PlaceHolder personal;



//class scope variable for our User Control

protected local.NewReg.webuser userTest;



//class scope declaration of a Csharp server object

protectedQA.Person.WebUserPerson person = null;



private void Page_Load(object sender, System.EventArgs e)

{

// Put user code to initialize the page here

//outside of a postback command so that the controls are always

loaded



//Load user controls

//load the User control and cast it to the variable type

userTest = (local.NewReg.webuser)Page.LoadControl("MyUserControl.ascx");

//add to the placeholder - will be stored as an object of type

Control

personal.Controls.Add(userTest);



//we also tried this...

//c is local but we will access via a class scope variable..

//Control c = Page.LoadControl("MyUserControl.ascx");

//personal.Controls.Add(c);



//and we also tried this..

//userTest= Page.LoadControl("/NewReg/MyUserControl.ascx");

//Personal.Controls.Add(userTest);









}



public void submitClick(object Source, ImageClickEventArgs e)

{

try

{



//get access to out webuser

person = new QA.Person.WebUserPerson();



//..now try to get access to the user control from the

submitClick() function



//doing this throws an indexOurOfRangeException

//which is weird because it should have one control in the

collection as defined in page_load

userTest =

(local.NewReg.webuser)Personal.Controls[0];

person.firstName = userTest.FirstName;



//or accessing the variable directly throws a

NullreferenceException

//which I don't get because we have

instantiated the variable in page_load

person.firstName = userTest.FirstName;

}



catch(Exception exc)

{// handle errors gracefully}



}





#region Web Form Designer generated code

override protected void OnInit(EventArgs e)

{

//

// CODEGEN: This call is required by the ASP.NET Web Form Designer.

//

InitializeComponent();

base.OnInit(e);

}



/// <summary>

/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

/// </summary>

private void InitializeComponent()

{

this.Load += new System.EventHandler(this.Page_Load);



}

#endregion

}

}


-
 

Re:unable to access User Control data HELP

Hi paul,



Thank you for using Microsoft Newsgroup Service. Based on your description,

you are trying to create an instance of a ASCX UserControl and add it into

a PlaceHolder control on an ASPX page programtically. However, you found

that it seems always nothing was in the PlaceHolder or event the

UserControl was not loaded correctly. Please correct me if my understanding

is not quite exact.



After reviewing the code you provided, I think I need to know something

else about your webpage and the UserControl:



1.Is the ASCX control and the containging page in the same web

project(using the same language to program)?



2.Are there any other UserControl in the same web project? Do they work

well?



3.Since you can't dynamically loaded a control onto a page programtically,

have you tried adding the same ascx control just by draging the ascx page

onto the containing page in the VS.NET IDE? If there is no problem to add

the control this way, I think the problem is not at the UserControl, do you

think so?



4. Does your UserControl(ascx) have a CodeBehind ascx.cs file with it or

just have one ascx page and with all the code in the <script runat=server>

block in it? Since the two different style UserControl need to set

different kind of <@control>directive. If you used a CodeBehind

file(generated by VS.NET) that the <@control>directive will be created by

default such as

<%@ Control Language="c#" AutoEventWireup="false"

Codebehind="MyCodeBehind.ascx.cs" Inherits="MyWebApp.MyCodeBehind" %>

And since the control's class will be build into web app's application

assemble, you can easily reference the type in other pages. Otherwise, if

your ascx UserControl doesn't have a CodeBehind page, you need to add a

"ClassName" attribute in the <@Control>directive. just as :



<%@ Control Language="c#" ClassName="SimpleUC" %>



Also, the way how to add the two style of UserControl into a page are

different, to make sure , you can add both the directive in your aspx page

as below:

<%@ Reference Control="MyCodeBehind.ascx" %>

<%@ Register TagPrefix="uc1" TagName="MyCodeBehind" Src="MyCodeBehind.ascx"

%>



If you feel my description not quite clear, you can view the relative

article on MSDN:

msdn.microsoft.com/library/en-us/cpguide/html/cpconinstantiatinguserc">msdn.microsoft.com/library/en-us/cpguide/html/cpconinstantiatinguserc

ontrolsprogrammatically.asp?frame=true

The article there shows many techniques about using a UserControl(

including how to programtically create a instance of a UserControl)







If the above info didn't help, I think you may try creating a new Simple

UserControl, I suggest that you reference the following linK:

msdn.microsoft.com/library/en-us/cpguide/html/cpconexposingpageletpro">msdn.microsoft.com/library/en-us/cpguide/html/cpconexposingpageletpro

perties.asp?frame=true



There is a good example of a UserControl. Please try whether such a generic

UserControl can work?





Please try my preceding suggestions and let me know whether they will help.





Steven Cheng

Microsoft Online Support



Get Secure! www.microsoft.com/security

(This posting is provided "AS IS", with no warranties, and confers no

rights.)



-

Re:unable to access User Control data HELP

Hi paul,



Have you had a chance to try my suggestion or have you resolved your

problem? Please let me know if you need

any help, Thanks.



Steven Cheng

Microsoft Online Support



Get Secure! www.microsoft.com/security

(This posting is provided "AS IS", with no warranties, and confers no

rights.)





-