ASP.NET 2.0 - Losing controls added in post back

Discussion in 'ASP .Net' started by Michael Lang, Dec 26, 2006.

  1. Michael Lang

    Michael Lang Guest

    I'm adding checkbox controls to a panel in a post back, I then have a second
    post back in which I attempt to process the checkbox controls however they
    seem to have disappeared off the panel. The following code demonstrates
    what I'm trying to do.

    Can anyone explain why there is no checkbox control on the panel when btnTwo
    is clicked?

    default.aspx:----------------------------------------------------------------------------------------------

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"
    Inherits="_Default" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
    <title>Untitled Page</title>
    </head>
    <body>
    <form id="form1" runat="server">
    <div>
    <asp:panel ID="pnlTest" runat="server"></asp:panel>
    <asp:Button ID="btnOne" runat="server" Text="Next>"
    OnClick="btnOne_Click" />
    <asp:Button ID="btnTwo" runat="server" Text="Save" Visible ="false"
    OnClick="btnTwo_Click" />
    <br />
    <asp:Label ID="Label1" runat="server"
    Text="Label"></asp:Label></div>
    </form>
    </body>
    </html>

    -----------------------------------------------------------------------------------------------------------

    default.aspx.cs:--------------------------------------------------------------------------------------------

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;

    public partial class _Default : System.Web.UI.Page
    {
    protected void Page_Load(object sender, EventArgs e)
    {
    }

    protected void btnOne_Click(object sender, EventArgs e)
    {
    btnOne.Visible = false;
    CheckBox chkTest = new CheckBox();
    chkTest.ID = "m";
    chkTest.Text = "CheckMe";
    btnTwo.Visible = true;

    pnlTest.Controls.Add(chkTest);
    }
    protected void btnTwo_Click(object sender, EventArgs e)
    {
    if (pnlTest.Controls.Count < 1)
    {
    Label1.Text = "Failed";
    return;
    }

    Control control = pnlTest.FindControl("m");
    CheckBox chkTest = control as CheckBox;
    if (chkTest.Checked)
    Label1.Text = "Worked";
    }
    }

    -----------------------------------------------------------------------------------------------------------

    Thanks in advance...

    Michael
    Michael Lang, Dec 26, 2006
    #1
    1. Advertising

  2. Michael,

    You have to re-create dynamically-created controls on every postback.

    Find more here:
    http://aspnet.4guysfromrolla.com/articles/092904-1.aspx

    --
    Eliyahu Goldin,
    Software Developer & Consultant
    Microsoft MVP [ASP.NET]
    http://msmvps.com/blogs/egoldin


    "Michael Lang" <micklang at gmail.com> wrote in message
    news:...
    > I'm adding checkbox controls to a panel in a post back, I then have a
    > second post back in which I attempt to process the checkbox controls
    > however they seem to have disappeared off the panel. The following code
    > demonstrates what I'm trying to do.
    >
    > Can anyone explain why there is no checkbox control on the panel when
    > btnTwo is clicked?
    >
    > default.aspx:----------------------------------------------------------------------------------------------
    >
    > <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"
    > Inherits="_Default" %>
    >
    > <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    > "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    >
    > <html xmlns="http://www.w3.org/1999/xhtml" >
    > <head runat="server">
    > <title>Untitled Page</title>
    > </head>
    > <body>
    > <form id="form1" runat="server">
    > <div>
    > <asp:panel ID="pnlTest" runat="server"></asp:panel>
    > <asp:Button ID="btnOne" runat="server" Text="Next>"
    > OnClick="btnOne_Click" />
    > <asp:Button ID="btnTwo" runat="server" Text="Save" Visible
    > ="false" OnClick="btnTwo_Click" />
    > <br />
    > <asp:Label ID="Label1" runat="server"
    > Text="Label"></asp:Label></div>
    > </form>
    > </body>
    > </html>
    >
    > -----------------------------------------------------------------------------------------------------------
    >
    > default.aspx.cs:--------------------------------------------------------------------------------------------
    >
    > using System;
    > using System.Data;
    > using System.Configuration;
    > using System.Web;
    > using System.Web.Security;
    > using System.Web.UI;
    > using System.Web.UI.WebControls;
    > using System.Web.UI.WebControls.WebParts;
    > using System.Web.UI.HtmlControls;
    >
    > public partial class _Default : System.Web.UI.Page
    > {
    > protected void Page_Load(object sender, EventArgs e)
    > {
    > }
    >
    > protected void btnOne_Click(object sender, EventArgs e)
    > {
    > btnOne.Visible = false;
    > CheckBox chkTest = new CheckBox();
    > chkTest.ID = "m";
    > chkTest.Text = "CheckMe";
    > btnTwo.Visible = true;
    >
    > pnlTest.Controls.Add(chkTest);
    > }
    > protected void btnTwo_Click(object sender, EventArgs e)
    > {
    > if (pnlTest.Controls.Count < 1)
    > {
    > Label1.Text = "Failed";
    > return;
    > }
    >
    > Control control = pnlTest.FindControl("m");
    > CheckBox chkTest = control as CheckBox;
    > if (chkTest.Checked)
    > Label1.Text = "Worked";
    > }
    > }
    >
    > -----------------------------------------------------------------------------------------------------------
    >
    > Thanks in advance...
    >
    > Michael
    >
    Eliyahu Goldin, Dec 26, 2006
    #2
    1. Advertising

  3. Michael Lang

    Michael Lang Guest

    Thanks...

    Quite right.

    I thought perhaps by re-adding the controls their state would be lost but
    through testing this looks not to be the case. So for anyone interested the
    following code works...

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;

    public partial class _Default : System.Web.UI.Page
    {
    protected void Page_Load(object sender, EventArgs e)
    {
    if (btnTwo.Visible)
    {
    CheckBox chkTest = new CheckBox();
    chkTest.ID = "m";
    chkTest.Text = "CheckMe";
    pnlTest.Controls.Add(chkTest);
    }
    }

    protected void btnOne_Click(object sender, EventArgs e)
    {
    btnOne.Visible = false;
    btnTwo.Visible = true;

    CheckBox chkTest = new CheckBox();
    chkTest.ID = "m";
    chkTest.Text = "CheckMe";

    pnlTest.Controls.Add(chkTest);
    }
    protected void btnTwo_Click(object sender, EventArgs e)
    {
    if (pnlTest.Controls.Count < 1)
    {
    Label1.Text = "Failed";
    return;
    }

    Control control = pnlTest.FindControl("m");
    CheckBox chkTest = control as CheckBox;
    if (chkTest.Checked)
    Label1.Text = "Is Checked";
    else
    Label1.Text = "Not Checked";
    }
    }


    "Eliyahu Goldin" <> wrote in
    message news:...
    > Michael,
    >
    > You have to re-create dynamically-created controls on every postback.
    >
    > Find more here:
    > http://aspnet.4guysfromrolla.com/articles/092904-1.aspx
    >
    > --
    > Eliyahu Goldin,
    > Software Developer & Consultant
    > Microsoft MVP [ASP.NET]
    > http://msmvps.com/blogs/egoldin
    >
    >
    > "Michael Lang" <micklang at gmail.com> wrote in message
    > news:...
    >> I'm adding checkbox controls to a panel in a post back, I then have a
    >> second post back in which I attempt to process the checkbox controls
    >> however they seem to have disappeared off the panel. The following code
    >> demonstrates what I'm trying to do.
    >>
    >> Can anyone explain why there is no checkbox control on the panel when
    >> btnTwo is clicked?
    >>
    >> default.aspx:----------------------------------------------------------------------------------------------
    >>
    >> <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"
    >> Inherits="_Default" %>
    >>
    >> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    >> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    >>
    >> <html xmlns="http://www.w3.org/1999/xhtml" >
    >> <head runat="server">
    >> <title>Untitled Page</title>
    >> </head>
    >> <body>
    >> <form id="form1" runat="server">
    >> <div>
    >> <asp:panel ID="pnlTest" runat="server"></asp:panel>
    >> <asp:Button ID="btnOne" runat="server" Text="Next>"
    >> OnClick="btnOne_Click" />
    >> <asp:Button ID="btnTwo" runat="server" Text="Save" Visible
    >> ="false" OnClick="btnTwo_Click" />
    >> <br />
    >> <asp:Label ID="Label1" runat="server"
    >> Text="Label"></asp:Label></div>
    >> </form>
    >> </body>
    >> </html>
    >>
    >> -----------------------------------------------------------------------------------------------------------
    >>
    >> default.aspx.cs:--------------------------------------------------------------------------------------------
    >>
    >> using System;
    >> using System.Data;
    >> using System.Configuration;
    >> using System.Web;
    >> using System.Web.Security;
    >> using System.Web.UI;
    >> using System.Web.UI.WebControls;
    >> using System.Web.UI.WebControls.WebParts;
    >> using System.Web.UI.HtmlControls;
    >>
    >> public partial class _Default : System.Web.UI.Page
    >> {
    >> protected void Page_Load(object sender, EventArgs e)
    >> {
    >> }
    >>
    >> protected void btnOne_Click(object sender, EventArgs e)
    >> {
    >> btnOne.Visible = false;
    >> CheckBox chkTest = new CheckBox();
    >> chkTest.ID = "m";
    >> chkTest.Text = "CheckMe";
    >> btnTwo.Visible = true;
    >>
    >> pnlTest.Controls.Add(chkTest);
    >> }
    >> protected void btnTwo_Click(object sender, EventArgs e)
    >> {
    >> if (pnlTest.Controls.Count < 1)
    >> {
    >> Label1.Text = "Failed";
    >> return;
    >> }
    >>
    >> Control control = pnlTest.FindControl("m");
    >> CheckBox chkTest = control as CheckBox;
    >> if (chkTest.Checked)
    >> Label1.Text = "Worked";
    >> }
    >> }
    >>
    >> -----------------------------------------------------------------------------------------------------------
    >>
    >> Thanks in advance...
    >>
    >> Michael
    >>

    >
    >
    Michael Lang, Dec 26, 2006
    #3
  4. Michael Lang

    Mark Rae Guest

    "Michael Lang" <micklang at gmail.com> wrote in message
    news:...

    > following code works...


    > protected void Page_Load(object sender, EventArgs e)


    In which case, you're quite fortunate...

    Generally speaking, in order to pretty much guarantee that such code will
    work, you need to create the dynamic controls in Page_Init, not Page_Load...
    Mark Rae, Dec 26, 2006
    #4
  5. Michael Lang

    Michael Lang Guest

    This would be because viewstate is loaded after the init and before the
    load.

    OK so my code needs a little rework.

    It makes it a bit of a chicken and egg problem when dealing with content
    dynamically generated based on previous input from the user, especially if
    you want this content to retain viewstate. I guess the answer is to persist
    input from the user between requests.....

    Hmm... I'm looking forward to the day I can suggest using XBAP instead of
    Web Apps.

    "Mark Rae" <> wrote in message
    news:...
    > "Michael Lang" <micklang at gmail.com> wrote in message
    > news:...
    >
    >> following code works...

    >
    >> protected void Page_Load(object sender, EventArgs e)

    >
    > In which case, you're quite fortunate...
    >
    > Generally speaking, in order to pretty much guarantee that such code will
    > work, you need to create the dynamic controls in Page_Init, not
    > Page_Load...
    >
    Michael Lang, Dec 27, 2006
    #5
  6. Michael Lang

    Joe (MCAD) Guest

    Michael Lang wrote:
    > This would be because viewstate is loaded after the init and before the
    > load.
    >
    > OK so my code needs a little rework.
    >
    > It makes it a bit of a chicken and egg problem when dealing with content
    > dynamically generated based on previous input from the user, especially if
    > you want this content to retain viewstate. I guess the answer is to persist
    > input from the user between requests.....
    >
    > Hmm... I'm looking forward to the day I can suggest using XBAP instead of
    > Web Apps.
    >
    > "Mark Rae" <> wrote in message
    > news:...
    >> "Michael Lang" <micklang at gmail.com> wrote in message
    >> news:...
    >>
    >>> following code works...
    >>> protected void Page_Load(object sender, EventArgs e)

    >> In which case, you're quite fortunate...
    >>
    >> Generally speaking, in order to pretty much guarantee that such code will
    >> work, you need to create the dynamic controls in Page_Init, not
    >> Page_Load...
    >>

    >
    >


    This is incorrect, you don't need to manually recreate the dynamic
    controls on postback to have them work. Instead use the LoadViewState
    and SaveViewState methods to remember and create what your dynamic
    controls are/were. Warning, this is add some viewstate weight.
    Joe (MCAD), Dec 28, 2006
    #6
  7. Michael Lang

    Mark Rae Guest

    "Joe (MCAD)" <> wrote in message
    news:fREkh.9913$...

    > Warning, this is add some viewstate weight.


    That's the understatement of the year!

    I've never used the LoadViewState and SaveViewState methods precisely
    because of the ViewState bloat they cause...
    Mark Rae, Dec 28, 2006
    #7
  8. Michael Lang

    Michael Lang Guest

    I've not used these methods before. They appear to be used for customising
    the processing of loading and saving the viewstate of a control. I'm not
    sure exactly what you're proposing here or what alternative solution they
    facilitate.

    Can you elaborate a little? Perhaps with a code example.

    "Joe (MCAD)" <> wrote in message
    news:fREkh.9913$...
    > Michael Lang wrote:
    >> This would be because viewstate is loaded after the init and before the
    >> load.
    >>
    >> OK so my code needs a little rework.
    >>
    >> It makes it a bit of a chicken and egg problem when dealing with content
    >> dynamically generated based on previous input from the user, especially
    >> if you want this content to retain viewstate. I guess the answer is to
    >> persist input from the user between requests.....
    >>
    >> Hmm... I'm looking forward to the day I can suggest using XBAP instead of
    >> Web Apps.
    >>
    >> "Mark Rae" <> wrote in message
    >> news:...
    >>> "Michael Lang" <micklang at gmail.com> wrote in message
    >>> news:...
    >>>
    >>>> following code works...
    >>>> protected void Page_Load(object sender, EventArgs e)
    >>> In which case, you're quite fortunate...
    >>>
    >>> Generally speaking, in order to pretty much guarantee that such code
    >>> will work, you need to create the dynamic controls in Page_Init, not
    >>> Page_Load...
    >>>

    >>
    >>

    >
    > This is incorrect, you don't need to manually recreate the dynamic
    > controls on postback to have them work. Instead use the LoadViewState and
    > SaveViewState methods to remember and create what your dynamic controls
    > are/were. Warning, this is add some viewstate weight.
    >
    >
    Michael Lang, Dec 28, 2006
    #8
  9. Michael Lang

    Michael Lang Guest

    I've managed to move all my dynamically generated content to the page_init
    as you've suggested so I've pretty much got this sorted. I'm only
    continuing this for academic purposes. The ASP.NET lifecycle goes...

    Init
    Load ViewState
    Load post back data from the form
    Page_Load
    Raise events due to post back data
    Save ViewState
    Render

    I understand now creating the dynamic content in the page_load worked only
    because of the type of controls I chose which seem to be processing data
    posted back in the form in the Raise PostBack event phase which occurs after
    the page_load. Some controls only process data posted in the form before
    the page_load, in that case or if your dynamic content required viewstate
    data then using the page_load isn't going to work.

    I'm guessing if you had a scenario where your dynamically generated content
    was based on data input from the user then you might opt to separate the
    functionality into separate pages or use session state instead of ViewState
    to keep state information about the content.

    "Mark Rae" <> wrote in message
    news:...
    > "Michael Lang" <micklang at gmail.com> wrote in message
    > news:...
    >
    >> following code works...

    >
    >> protected void Page_Load(object sender, EventArgs e)

    >
    > In which case, you're quite fortunate...
    >
    > Generally speaking, in order to pretty much guarantee that such code will
    > work, you need to create the dynamic controls in Page_Init, not
    > Page_Load...
    >
    Michael Lang, Dec 28, 2006
    #9
  10. Michael Lang

    Michael Lang Guest

    I've always avoided using ViewState all together hence a lot of the issues
    we're discussing relating to the loading and saving of viewstate I've not
    dealt with before, which also might explain my "Luck".

    "Mark Rae" <> wrote in message
    news:...
    > "Joe (MCAD)" <> wrote in message
    > news:fREkh.9913$...
    >
    >> Warning, this is add some viewstate weight.

    >
    > That's the understatement of the year!
    >
    > I've never used the LoadViewState and SaveViewState methods precisely
    > because of the ViewState bloat they cause...
    >
    Michael Lang, Dec 28, 2006
    #10
  11. Michael Lang

    Michael Lang Guest

    P.S

    Can anyone give examples of controls which only load post back form data
    before the page load ?


    "Michael Lang" <micklang at gmail.com> wrote in message
    news:%...
    > I've managed to move all my dynamically generated content to the page_init
    > as you've suggested so I've pretty much got this sorted. I'm only
    > continuing this for academic purposes. The ASP.NET lifecycle goes...
    >
    > Init
    > Load ViewState
    > Load post back data from the form
    > Page_Load
    > Raise events due to post back data
    > Save ViewState
    > Render
    >
    > I understand now creating the dynamic content in the page_load worked only
    > because of the type of controls I chose which seem to be processing data
    > posted back in the form in the Raise PostBack event phase which occurs
    > after the page_load. Some controls only process data posted in the form
    > before the page_load, in that case or if your dynamic content required
    > viewstate data then using the page_load isn't going to work.
    >
    > I'm guessing if you had a scenario where your dynamically generated
    > content was based on data input from the user then you might opt to
    > separate the functionality into separate pages or use session state
    > instead of ViewState to keep state information about the content.
    >
    > "Mark Rae" <> wrote in message
    > news:...
    >> "Michael Lang" <micklang at gmail.com> wrote in message
    >> news:...
    >>
    >>> following code works...

    >>
    >>> protected void Page_Load(object sender, EventArgs e)

    >>
    >> In which case, you're quite fortunate...
    >>
    >> Generally speaking, in order to pretty much guarantee that such code will
    >> work, you need to create the dynamic controls in Page_Init, not
    >> Page_Load...
    >>

    >
    >
    Michael Lang, Dec 28, 2006
    #11
  12. Michael Lang

    Mark Rae Guest

    "Michael Lang" <micklang at gmail.com> wrote in message
    news:...

    > Can anyone give examples of controls which only load post back form data
    > before the page load ?


    DropDownList.

    In order for them to work properly across postback, their datasource must be
    populated in Page_Init, otherwise their selected value will be lost.
    Mark Rae, Dec 28, 2006
    #12
  13. Michael Lang

    Michael Lang Guest

    My testing seems to suggest otherwise....

    The following code does not lose the selected value. I think this is
    because the dropdownlist fires the event selectedindexchanged after the page
    load....

    Try this code...

    default.aspx:----------------------------------------------------------------------------

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"
    Inherits="_Default" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
    <title>Untitled Page</title>
    </head>
    <body>
    <form id="form1" runat="server">
    <div>
    <asp:panel ID="pnlTest" runat="server"></asp:panel>
    <asp:Button ID="btnOne" runat="server" Text="Next>"
    OnClick="btnOne_Click" />
    <asp:Button ID="btnTwo" runat="server" Text="Save" Visible ="false"
    OnClick="btnTwo_Click" />
    <br />
    <asp:Label ID="Label1" runat="server"
    Text="Label"></asp:Label></div>
    <asp:Label ID="Label2" runat="server"
    Text="Label"></asp:Label></div>
    </form>
    </body>
    </html>

    Default.aspx.cs------------------------------------------------------------------------------

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;

    public partial class _Default : System.Web.UI.Page
    {
    protected void Page_Init(object sender, EventArgs e)
    {

    }

    protected void Page_Load(object sender, EventArgs e)
    {
    if (btnTwo.Visible)
    {
    GenerateContent();
    DropDownList dropTest = pnlTest.FindControl("n") as
    DropDownList;
    string sel = dropTest.SelectedValue;
    }
    }

    private void GenerateContent()
    {
    CheckBox chkTest = new CheckBox();
    chkTest.ID = "m";
    chkTest.Text = "CheckMe";
    pnlTest.Controls.Add(chkTest);

    DropDownList dropDown = new DropDownList();
    dropDown.ID = "n";
    dropDown.Items.Add("Selection one");
    dropDown.Items.Add("Selection two");
    dropDown.Items.Add("Selection three");

    pnlTest.Controls.Add(dropDown);
    pnlTest.Controls.Add(chkTest);
    }

    protected override void RaisePostBackEvent(IPostBackEventHandler
    sourceControl, string eventArgument)
    {
    base.RaisePostBackEvent(sourceControl, eventArgument);
    }

    protected void btnOne_Click(object sender, EventArgs e)
    {
    btnOne.Visible = false;
    btnTwo.Visible = true;

    GenerateContent();
    }
    protected void btnTwo_Click(object sender, EventArgs e)
    {
    if (pnlTest.Controls.Count < 1)
    {
    Label1.Text = "Failed";
    return;
    }

    Control control = pnlTest.FindControl("m");
    CheckBox chkTest = control as CheckBox;
    if (chkTest.Checked)
    Label1.Text = "Worked";

    control = pnlTest.FindControl("n");
    DropDownList dropTest = control as DropDownList;
    Label2.Text = dropTest.SelectedValue;
    }
    }



    "Mark Rae" <> wrote in message
    news:...
    > "Michael Lang" <micklang at gmail.com> wrote in message
    > news:...
    >
    >> Can anyone give examples of controls which only load post back form data
    >> before the page load ?

    >
    > DropDownList.
    >
    > In order for them to work properly across postback, their datasource must
    > be populated in Page_Init, otherwise their selected value will be lost.
    >
    Michael Lang, Dec 29, 2006
    #13
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Kevin Cunningham

    Label within repeater losing text on post back

    Kevin Cunningham, Jan 20, 2005, in forum: ASP .Net
    Replies:
    3
    Views:
    6,300
    Eliyahu Goldin
    Jan 20, 2005
  2. Replies:
    8
    Views:
    476
  3. =?Utf-8?B?U3JpZGhhcg==?=

    textbox in user control losing values during post back

    =?Utf-8?B?U3JpZGhhcg==?=, Aug 23, 2006, in forum: ASP .Net
    Replies:
    2
    Views:
    1,498
    =?Utf-8?B?U3JpZGhhcg==?=
    Aug 23, 2006
  4. =?Utf-8?B?Z29yaWxsYQ==?=
    Replies:
    1
    Views:
    750
    Masudur
    May 25, 2007
  5. Wolfgang Brucker

    user controls: dynamiclly added child controls dont survive post back ?

    Wolfgang Brucker, Jan 14, 2004, in forum: ASP .Net Building Controls
    Replies:
    1
    Views:
    507
    Victor Garcia Aprea [MVP]
    Jan 14, 2004
Loading...

Share This Page