Anyone manage to come up with any solutions or alternate ideas to my problem, or have I managed to stump the great minds on this list ;)
I've already tried looking elsewhere, on Google, MSDN, and the ng's, to no avail; this list was my last defense... Is there really no way to get tracing working with what I'm trying to do? Thanks, --Oren > -----Original Message----- > From: Moderated discussion of advanced .NET topics. [mailto:ADVANCED- > [EMAIL PROTECTED]] On Behalf Of Oren Novotny > Sent: Monday, November 11, 2002 7:53 AM > To: [EMAIL PROTECTED] > Subject: Exception when using Trace with cached controls > > I posted this on Thursday today in the -Web list, but so far there's > been no response and I suspect it's too arcane for that list anyway. > > I'm getting an exception if I enable output tracing in my app. The > exception is: > > System.Web.HttpException: Multiple controls with the same ID '_ctl1' > were found. Trace requires that controls have unique IDs. > > Here is my scenario: I have a page that contains a bunch of controls of > the same type, just with different parameters. Each time the control is > loaded, it sets itself up with data from the DB. What I'm trying to do > is to cache the control so that it doesn't go to the DB every time. The > control has to display tree of items in it, requiring a recursive DB > call. I'd like to avoid repopulating often. > > I have PlaceHolder p and a bunch of MyControl's that get added to > p.Controls > > Here's what I'm doing (pls ignore capitalization, since Word is > auto-formatting): > > In Page_Load(): > > If(Cache["key"] == null) > { > RefreshCache() > } > else > { > MyControl[] myControls = (MyControl[])Cache["key"]; > > Foreach(MyControl con in myControls) > { > p.Controls.Add(con); > } > } > > In RefreshCache(): > { > ...get data > Foreach(Data d in Datas) > { > MyControl myC = (MyControl)LoadControl("~/MyControl.ascx"); > > // Set a property-- setting this property will trigger > // it to fill the rest of it's data from the DB > myC.PropertyId = d.PropID; > > // Add it to the placeholder > p.Controls.Add(myC); > } > > // store it in the cache > MyControl[] myControls = new MyControl[p.Controls.Count]; > //Copy the controls to the array > p.Controls.CopyTo(myControls, 0); > > Cache.Insert("key", myControls, null, DateTime.Now.AddMinutes(5), > TimeSpan.Zero); > } > > I also have a public static method to invalidate the cache when > necessary (if changes are made that would affect the data in the > control). > > I can't use OutPutCache, since the control has to deal with some > PostBacks, and you can't do that with an OutPutCache. Also, I want to > be able to programmatically invalidate it, which you also cannot do with > OutPutCache. > > Now, as is, everything does work. Data is cached after the first load, > and upon a page refresh, the controls are taken from the cache. If I > then invalidate the cache, it reloads the data. So far, so good. > > But--if I enable page tracing, I get the exception that I mentioned > earlier. I want to be able to use the tracing, since it provides useful > info, but I also want to cache these controls. > > Any thoughts? > > --Oren > > You can read messages from the Advanced DOTNET archive, unsubscribe from > Advanced DOTNET, or > subscribe to other DevelopMentor lists at http://discuss.develop.com. You can read messages from the Advanced DOTNET archive, unsubscribe from Advanced DOTNET, or subscribe to other DevelopMentor lists at http://discuss.develop.com.
