Re: explanation of when need to repopulate control
- From: "TS" <manofsteele1@xxxxxxxxxxxxx>
- Date: Wed, 3 Aug 2005 15:02:12 -0500
In testing, i removed the main parent dropdown and only left the 2 below it.
this time, the same scenario happened...when the child dropdown list
autopostsback, it's immediate parent's selectedindexchanged event fires! I'm
starting to pull my hair out now...I"m stuck!
please help superman
"TS" <manofsteele1@xxxxxxxxxxxxx> wrote in message
news:eNZro3FmFHA.1948@xxxxxxxxxxxxxxxxxxxxxxx
> Another problem:
>
> while i'm waiting on your remark to my last post, i removed the sub
> composite controls from my composite control so that there is only drop
down
> lists on it. During CreateChildcontrols, i load the main drop down using
> databind. When the page is sent to browser for the first time, i have my
> main drop down filled. I then select an item and its SelectedIndexChanged
> fires and populates the send drop down list. Then when i select an item
from
> it, it posts back, and the event that gets called is the main(first)
> dropdown list's SelectedIndexChanged event, which then re-populates the
> second drop down list, then the control returns to the browser (The
> SelectedIndexChanged event never fired for the 2nd dropdown's changed
> event.???
>
> thanks again
>
> using System;
>
> using System.Collections.Specialized;
>
> using System.Web.UI;
>
> using System.Web.UI.WebControls;
>
> using System.Text;
>
> using OperationsTeams.Business;
>
> using OperationsTeams.Data;
>
> using OperationsTeams.Reporting;
>
> using OperationsTeams.Reporting.WebControls;
>
> namespace OperationsTeams.Web.ReportControls
>
> {
>
> /// <summary>
>
> /// Summary description for FiscalAgentHierarchy.
>
> /// </summary>
>
> public class FiscalAgentHierarchy : WebControl, IReportParameterControl,
> INamingContainer
>
> {
>
> public FiscalAgentHierarchy()
>
> {
>
> Parameters.Add(new Parameter("@SchoolYear"));
>
> Parameters.Add(new Parameter("@ReportingGroup"));
>
> Parameters.Add(new Parameter("@FiscalAgentID"));
>
> Parameters.Add(new Parameter("@FundingSourceID"));
>
> Parameters.Add(new Parameter("@ProviderID"));
>
> Parameters.Add(new Parameter("@SiteID"));
>
> Parameters.Add(new Parameter("@ClassID"));
>
> Parameters["@SchoolYear"].Value = 2006;
>
> }
>
>
> #region Events
>
> protected override void OnLoad(EventArgs e)
>
> {
>
> base.OnLoad (e);
>
>
> // The last state of controls from viewstate is now loaded (Before the
> client data is processed)
>
> }
>
>
> protected override void OnPreRender(EventArgs e)
>
> {
>
> base.OnPreRender (e);
>
> // The controls now have the client values from the the last postback
>
> // ddlFundingSource.Visible = FundingSourceVisible;
>
> // ddlProviders.Visible = ProviderVisible;
>
> // ddlSites.Visible = SiteVisible;
>
> // ddlClasses.Visible = ClassVisible;
>
> // ddlSites.Items.Add(new ListItem("help","1"));
>
> // ddlSites.Items.Add(new ListItem("me","2"));
>
> // ddlSites.Visible = true;
>
> }
>
> private void rysReportingYearSelector_ReportingYearChanged(object sender,
> EventArgs e)
>
> {
>
> // this.LoadFundingSource();
>
> // this.LoadProviders();
>
> }
>
> private void fasFiscalAgent_FiscalAgentChanged(object sender, EventArgs e)
>
> {
>
> this.LoadFundingSource();
>
> this.LoadProviders();
>
> }
>
> private void ddlFundingSource_SelectedIndexChanged(object sender,
EventArgs
> e)
>
> {
>
> LoadSites();
>
> }
>
> private void ddlProviders_SelectedIndexChanged(object sender, EventArgs e)
>
> {
>
> LoadSites();
>
> }
>
> private void ddlSites_SelectedIndexChanged(object sender, EventArgs e)
>
> {
>
> LoadClasses();
>
> }
>
> #endregion
>
> protected override void CreateChildControls()
>
> {
>
> this.ddlFundingSource = new DropDownList();
>
> this.ddlProviders = new DropDownList();
>
> this.ddlSites = new DropDownList();
>
> this.ddlClasses = new DropDownList();
>
> ddlFundingSource.ID = FundingSourceControlId;
>
> ddlProviders.ID = ProvidersControlId;
>
> ddlSites.ID = SitesControlId;
>
> ddlClasses.ID = ClassesControlId;
>
>
> LoadProviders();
>
> // start containing table
>
> this.Controls.Add(WebHelper.MakeLiteral("<table cellpadding=0
> cellspacing=0><tr><td>"));
>
>
> this.Controls.Add(WebHelper.MakeLiteral("<table><tr><td>"));
>
> // this.Controls.Add(rysReportingYearSelector);
>
> this.Controls.Add(WebHelper.MakeLiteral("</td></tr></table>"));
>
> this.Controls.Add(WebHelper.MakeLiteral("</td></tr><tr><td>"));
>
> this.Controls.Add(WebHelper.MakeLiteral("<table><tr><td>"));
>
> // this.Controls.Add(fasFiscalAgent);
>
> this.Controls.Add(WebHelper.MakeLiteral("</td></tr></table>"));
>
> this.Controls.Add(WebHelper.MakeLiteral("</td></tr><tr><td>"));
>
> this.Controls.Add(WebHelper.MakeLiteral("<table><tr><td>Funding
> Source</td><td>"));
>
> this.Controls.Add(ddlFundingSource);
>
> this.Controls.Add(WebHelper.MakeLiteral("</td></tr></table>"));
>
> this.Controls.Add(WebHelper.MakeLiteral("</td></tr><tr><td>"));
>
>
this.Controls.Add(WebHelper.MakeLiteral("<table><tr><td>Providers</td><td>")
> );
>
> this.Controls.Add(ddlProviders);
>
> this.Controls.Add(WebHelper.MakeLiteral("</td></tr></table>"));
>
> this.Controls.Add(WebHelper.MakeLiteral("</td></tr><tr><td>"));
>
> this.Controls.Add(WebHelper.MakeLiteral("<table><tr><td>Sites</td><td>"));
>
> this.Controls.Add(ddlSites);
>
> this.Controls.Add(WebHelper.MakeLiteral("</td></tr></table>"));
>
> this.Controls.Add(WebHelper.MakeLiteral("</td></tr><tr><td>"));
>
>
this.Controls.Add(WebHelper.MakeLiteral("<table><tr><td>Classes</td><td>"));
>
> this.Controls.Add(ddlClasses);
>
> this.Controls.Add(WebHelper.MakeLiteral("</td></tr></table>"));
>
> // end containing table
>
> this.Controls.Add(WebHelper.MakeLiteral("</td></tr></table>"));
>
> ddlFundingSource.SelectedIndexChanged += new
> EventHandler(ddlFundingSource_SelectedIndexChanged);
>
> ddlProviders.SelectedIndexChanged += new
> EventHandler(ddlProviders_SelectedIndexChanged);
>
> ddlSites.SelectedIndexChanged += new
> EventHandler(ddlSites_SelectedIndexChanged);
>
> ddlFundingSource.AutoPostBack = ddlProviders.AutoPostBack =
> ddlSites.AutoPostBack = true;
>
>
> }
>
> private void LoadFundingSource()
>
> {
>
> int fiscalAgentId = 1;//this.fasFiscalAgent.SelectedFiscalAgentId;
>
>
> if(fiscalAgentId != int.MinValue)
>
> {
>
> FundingSourceVisible = true;
>
> this.ddlFundingSource.DataSource = FiscalAgentFunding.Find(fiscalAgentId);
>
> this.ddlFundingSource.DataTextField = "ShortDescription";
>
> this.ddlFundingSource.DataValueField = "CodeId";
>
> this.ddlFundingSource.DataBind();
>
> if(this.ddlFundingSource.Items.Count > 1)
>
> this.ddlFundingSource.Items.Insert(0, new ListItem(string.Empty,
> string.Empty));
>
> }
>
> else
>
> {
>
> FundingSourceVisible = false;
>
> }
>
> }
>
> private void LoadProviders()
>
> {
>
> int fiscalAgentId = 1;//fasFiscalAgent.SelectedFiscalAgentId;
>
> if(fiscalAgentId != int.MinValue)
>
> {
>
> // ddlSites.Items.Add(new ListItem("help","1"));
>
> // ddlSites.Items.Add(new ListItem("me","2"));
>
>
>
> ProviderVisible = true;
>
> // are these dates correct???????????????????????????
>
> ddlProviders.DataSource = FiscalAgentProvider.Find(fiscalAgentId, new
> DateTime(2005,7,1), new
> DateTime(2006,6,30));//rysReportingYearSelector.ReportingYearStartDate,
> rysReportingYearSelector.ReportingYearEndDate); //
>
> ddlProviders.DataTextField = "ProviderName";
>
> ddlProviders.DataValueField = "ProviderId";
>
> ddlProviders.DataBind();
>
> ddlProviders.Items.Insert(0, new ListItem(string.Empty, string.Empty));
>
> }
>
> else
>
> {
>
> this.ddlProviders.Items.Clear();
>
> ProviderVisible = false;
>
> }
>
> // LoadSites();
>
> }
>
> private void LoadSites()
>
> {
>
> if(ddlProviders.SelectedValue != string.Empty)
>
> {
>
> // Load the Site search parameters.
>
> SiteFindArgs siteFindArgs=new SiteFindArgs();
>
> siteFindArgs.FiscalAgentId=1;
> //Convert.ToInt32(fasFiscalAgent.SelectedFiscalAgentId);
>
> SiteVisible = true;
>
> ddlSites.DataSource = Business.Site.Find(siteFindArgs);
>
> ddlSites.DataTextField = "Name";
>
> ddlSites.DataValueField = "SiteId";
>
> ddlSites.DataBind();
>
> ddlSites.Items.Insert(0, new ListItem(string.Empty, string.Empty));
>
> }
>
> else
>
> {
>
> ddlSites.Items.Clear();
>
> SiteVisible = false;
>
> }
>
> // LoadClasses();
>
> }
>
> private void LoadClasses()
>
> {
>
> if(ddlSites.SelectedValue != string.Empty)
>
> {
>
> AdultEdClassFindArgs adultEdClassFindArgs = new AdultEdClassFindArgs();
>
> // adultEdClassFindArgs.FiscalAgentId =
> Convert.ToInt32(fasFiscalAgent.SelectedFiscalAgentId);
>
> // adultEdClassFindArgs.ReportingYearStartDate =
> rysReportingYearSelector.ReportingYearStartDate;
>
> // adultEdClassFindArgs.ReportingYearEndDate =
> rysReportingYearSelector.ReportingYearEndDate;
>
> // adultEdClassFindArgs.ProviderName = ddlProviders.SelectedValue;
>
> // adultEdClassFindArgs.SiteName = ddlSites.SelectedValue;
>
>
> ClassVisible = true;
>
> ddlClasses.DataSource = AdultEdClass.Find(adultEdClassFindArgs);
>
> ddlClasses.DataTextField = "Name";
>
> ddlClasses.DataValueField = "ClassId";
>
> ddlClasses.DataBind();
>
> ddlClasses.Items.Insert(0, new ListItem(string.Empty, string.Empty));
>
> }
>
> else
>
> {
>
> ddlClasses.Items.Clear();
>
> ClassVisible = false;
>
> }
>
> }
>
>
>
> #region Public Properties
>
> #region IReportParameterControl Members
>
> public object ParameterValue
>
> {
>
> get{ return null; }
>
> set{ /*do nothing */ }
>
> }
>
> public ParameterCollection Parameters
>
> {
>
> get{ return parameters; }
>
> set{ parameters = value;}
>
> }
>
> #endregion
>
> protected bool FundingSourceVisible
>
> {
>
> get
>
> {
>
> if(ViewState["FundingSourceVisible"] == null)
>
> {
>
> return false;
>
> }
>
> return (bool)ViewState["FundingSourceVisible"];
>
> }
>
> set
>
> {
>
> TrackViewState();
>
> ViewState["FundingSourceVisible"] = value;
>
> }
>
> }
>
> protected bool ProviderVisible
>
> {
>
> get
>
> {
>
> if(ViewState["ProviderVisible"] == null)
>
> {
>
> return false;
>
> }
>
> return (bool)ViewState["ProviderVisible"];
>
> }
>
> set
>
> {
>
> TrackViewState();
>
> ViewState["ProviderVisible"] = value;
>
> }
>
> }
>
> protected bool SiteVisible
>
> {
>
> get
>
> {
>
> if(ViewState["SiteVisible"] == null)
>
> {
>
> return false;
>
> }
>
> return (bool)ViewState["SiteVisible"];
>
> }
>
> set
>
> {
>
> TrackViewState();
>
> ViewState["SiteVisible"] = value;
>
> }
>
> }
>
> protected bool ClassVisible
>
> {
>
> get
>
> {
>
> if(ViewState["ClassVisible"] == null)
>
> {
>
> return false;
>
> }
>
> return (bool)ViewState["ClassVisible"];
>
> }
>
> set
>
> {
>
> TrackViewState();
>
> ViewState["ClassVisible"] = value;
>
> }
>
> }
>
> #endregion
>
> #region Private Member Variables
>
> private DropDownList ddlFundingSource;
>
> private DropDownList ddlProviders;
>
> private DropDownList ddlSites;
>
> private DropDownList ddlClasses;
>
> private ParameterCollection parameters = new ParameterCollection();
>
> #endregion
>
> #region Private Constants
>
> private const string ReportingYearSelectorControlId =
> "rysReportingYearSelector";
>
> private const string FiscalAgentSelectorControlId =
> "fasFiscalAgentSelector";
>
> private const string FundingSourceControlId = "ddlFundingSource";
>
> private const string FundingSourceLabelControlId = "lblFundingSource";
>
> private const string ProvidersControlId = "ddlProviders";
>
> private const string ProvidersLabelControlId = "lblProviders";
>
> private const string SitesControlId = "ddlSites";
>
> private const string SitesLabelControlId = "lblSites";
>
> private const string ClassesControlId = "ddlClasses";
>
> private const string ClassesLabelControlId = "lblClasses";
>
> #endregion
>
> }
>
> }
>
>
> "Steven Cheng[MSFT]" <stcheng@xxxxxxxxxxxxxxxxxxxx> wrote in message
> news:2rQIZ7$lFHA.940@xxxxxxxxxxxxxxxxxxxxxxxx
> > Hi TS,
> >
> > See you again :-), seems you're rushing in a asp.net project these days?
> > For the question you mentioned in this post, here are some of my
> > understanding and suggestions:
> >
> > 1. ASP.NET controls derived from Control will automatically maintain its
> > ViewStates according to the asp.net web page's events sequence. So for
> > composite control, those nested sub Controls' status (properties which
be
> > persistd in Viewsstate ) will be store and retrieve automatically.
> >
> > 2. However, there're some thing we need to care when building composite
> > control:
> > #remember to implement INamingContainer for controls which will have
> nested
> > sub controls. Otherwise, even handler mapping, ViewState loading will
> occur
> > unexpectedly.
> >
> > #Do remember to assign a explicit ID for each sub controls(same reason
as
> > #1). Also, please always try best to add subcontrols in the
> > "CreateChildControls" method(just create control hierarchy) and put
> > manipulating code in postback event or PreRender event.
> >
> > In addition, for your detaile scenario, I've just built a very simple
demo
> > control which have three dropdownlists and The "Top" one will display
> > first(other twos invisible) and according to the top one's selection,
the
> > "Mid" dropdownlist will be pouplated and the same when the "mid"'s
> > selection changed......
> >
> > Here's the control's code for your reference:
> >
> > =========================
> > [DefaultProperty("Text"),
> > ToolboxData("<{0}:MultiListControl
runat=server></{0}:MultiListControl>")]
> > public class MultiListControl : System.Web.UI.WebControls.WebControl,
> > INamingContainer
> > {
> > private string text;
> >
> > private DropDownList lstTop;
> > private DropDownList lstMid;
> > private DropDownList lstBot;
> >
> >
> >
> >
> >
> > protected bool MidVisible
> > {
> > get{
> > if(ViewState["MID_VISIBLE"] == null)
> > {
> > return false;
> > }
> >
> > return (bool)ViewState["MID_VISIBLE"];
> > }
> >
> > set{
> > TrackViewState();
> > ViewState["MID_VISIBLE"] = value;
> > }
> > }
> >
> > protected bool BotVisible
> > {
> > get
> > {
> > if(ViewState["BOT_VISIBLE"] == null)
> > {
> > return false;
> > }
> >
> > return (bool)ViewState["BOT_VISIBLE"];
> > }
> >
> > set
> > {
> > TrackViewState();
> > ViewState["BOT_VISIBLE"] = value;
> > }
> > }
> >
> >
> > [Bindable(true),
> > Category("Appearance"),
> > DefaultValue("")]
> > public string Text
> > {
> > get
> > {
> > return text;
> > }
> >
> > set
> > {
> > text = value;
> > }
> > }
> >
> >
> > protected override void CreateChildControls()
> > {
> > Controls.Clear();
> >
> > Controls.Add(
> > new LiteralControl(
> > @"
> > <table width='100%'>
> > <tr><td>
> > "));
> >
> > lstTop = new DropDownList();
> > lstTop.ID = "lstTop";
> >
> > lstTop.Items.Add("----------");
> > lstTop.Items.Add("Top_Item_1");
> > lstTop.Items.Add("Top_Item_2");
> > lstTop.Items.Add("Top_Item_3");
> > lstTop.Items.Add("Top_Item_4");
> >
> > Controls.Add(lstTop);
> >
> > Controls.Add(
> > new LiteralControl(
> > @"<br/>"
> > ));
> >
> > lstMid = new DropDownList();
> > lstMid.ID = "lstMid";
> >
> > Controls.Add(lstMid);
> >
> > Controls.Add(
> > new LiteralControl(
> > @"<br/>"
> > ));
> >
> >
> > lstBot = new DropDownList();
> > lstBot.ID = "lstBot";
> >
> > Controls.Add(lstBot);
> >
> >
> > Controls.Add(
> > new LiteralControl(
> > @"
> > </td></tr>
> > </table>
> > "
> > ));
> >
> >
> >
> > lstTop.SelectedIndexChanged +=new
EventHandler(lst_SelectedIndexChanged);
> > lstMid.SelectedIndexChanged +=new
EventHandler(lst_SelectedIndexChanged);
> > lstBot.SelectedIndexChanged +=new
EventHandler(lst_SelectedIndexChanged);
> >
> > lstTop.AutoPostBack = lstMid.AutoPostBack = lstBot.AutoPostBack = true;
> >
> >
> > }
> >
> >
> > protected override void OnPreRender(EventArgs e)
> > {
> > base.OnPreRender (e);
> >
> > lstMid.Visible = MidVisible;
> > lstBot.Visible = BotVisible;
> > }
> >
> >
> >
> >
> > private void lst_SelectedIndexChanged(object sender, System.EventArgs e)
> > {
> >
> > DropDownList lst = sender as DropDownList;
> >
> > switch(lst.ID)
> > {
> > case "lstTop":
> >
> > if(lst.SelectedIndex != 0)
> > {
> > lstMid.DataSource = GetSubItems(lst.SelectedValue);
> > lstMid.DataTextField = "Text";
> > lstMid.DataValueField= "Value";
> > lstMid.DataBind();
> >
> > MidVisible = true;
> > }
> > else
> > {
> > MidVisible = BotVisible = false;
> > }
> >
> > break;
> > case "lstMid":
> >
> > lstBot.DataSource = GetSubItems(lst.SelectedValue);
> > lstBot.DataTextField = "Text";
> > lstBot.DataValueField= "Value";
> > lstBot.DataBind();
> >
> > MidVisible = BotVisible = true;
> >
> > break;
> > case "lstBot":
> >
> >
> >
> > break;
> > }
> >
> > Page.Response.Write("<br>" + lst.ID + "_selectedindexchanged!" +
> > lst.EnableViewState);
> > }
> >
> > #region --Helper functions---
> >
> > public ListItemCollection GetSubItems(string parent)
> > {
> > ListItemCollection items = new ListItemCollection();
> > int count = parent.Length;
> >
> > for(int i=0;i<count;++i)
> > {
> > items.Add(parent + "_Item_" + i);
> > }
> >
> > return items;
> > }
> >
> >
> > #endregion
> > }
> >
> > ========================
> > Hope helps. 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.)
> >
> >
> > --------------------
> > | From: "TS" <manofsteele1@xxxxxxxxxxxxx>
> > | References: <uzUvXf6lFHA.1372@xxxxxxxxxxxxxxxxxxxx>
> > | Subject: Re: explanation of when need to repopulate control
> > | Date: Tue, 2 Aug 2005 18:32:23 -0500
> > | Lines: 39
> > | X-Priority: 3
> > | X-MSMail-Priority: Normal
> > | X-Newsreader: Microsoft Outlook Express 6.00.2800.1158
> > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165
> > | Message-ID: <uRDywp7lFHA.3552@xxxxxxxxxxxxxxxxxxxx>
> > | Newsgroups:
> >
>
microsoft.public.dotnet.framework.aspnet.webcontrols,microsoft.public.dotnet
> > framework.aspnet.buildingcontrols
> > | NNTP-Posting-Host: 103nat100.tea.state.tx.us 198.214.103.100
> > | Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
> > | Xref: TK2MSFTNGXA01.phx.gbl
> > microsoft.public.dotnet.framework.aspnet.buildingcontrols:3979
> > microsoft.public.dotnet.framework.aspnet.webcontrols:10243
> > | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.buildingcontrols
> > |
> > | sorry, heres the scenario i'm trying to accomplish:
> > | I have a composite control that contains 4 drop down lists. When the
> page
> > | loads initially, i want the first drop down filled and the rest
> invisible.
> > | When you select an item in this ddl, it posts back to the server and
> based
> > | on its value, it populates its immediate child's drop down list. So
now
> > the
> > | top ddl has a value selected and the 2nd one just has its items
> populated.
> > | Then when the 2nd drop down list gets selected, it posts to the server
> and
> > | its value is used to populate(filter) the items for the 3rd drop down
> > | list...and so on for each drop down list.
> > |
> > | Please tell me what i need to do to handle post back data and maintain
> > state
> > | from one postback to another while keeping the drop downlists filled
and
> > | their values persisted.
> > |
> > | thank you again!
> > |
> > |
> > | "TS" <manofsteele1@xxxxxxxxxxxxx> wrote in message
> > | news:uzUvXf6lFHA.1372@xxxxxxxxxxxxxxxxxxxxxxx
> > | > I have a quesiton:
> > | > if i have a composite control and on its intial page loading, i fill
> my
> > | (sub
> > | > control) drop down list's items collection from the database and
> return.
> > | > When the user hits a button to cause postback, the control is going
to
> > get
> > | > initialized, then does its items collection that i filled on the
> initial
> > | > page request get repopulated from viewstate? And on top of that, if
> so,
> > | does
> > | > the list item that person selected in the drop down list again set
> > itself
> > | as
> > | > the selected item in the list?
> > | >
> > | > OR do i have to re-load the items on every page request and then
> > populate
> > | > its value some other way???
> > | >
> > | > thanks a bunch
> > | >
> > | >
> > |
> > |
> > |
> >
>
>
.
- Follow-Ups:
- References:
- Re: explanation of when need to repopulate control
- From: Steven Cheng[MSFT]
- Re: explanation of when need to repopulate control
- From: TS
- Re: explanation of when need to repopulate control
- Prev by Date: Re: explanation of when need to repopulate control
- Next by Date: Re: explanation of when need to repopulate control
- Previous by thread: Re: explanation of when need to repopulate control
- Next by thread: Re: explanation of when need to repopulate control
- Index(es):