Generating dynamic controls in dynamic placeholder C#

230 Views Asked by At

I made code to dynamically creating controls, by using a placeholder. This program generates a simple form for creating surveys. Structure of the program has two parts. First part dynamically creates many controls includes PlaceHolders. For better understanding, I added scraps of the code.

At first, I created a few private lists, for ex.

 private List<string> LabelsList
{
    get
    {
        if (ViewState["labels"] == null)
        {
            ViewState["labels"] = new List<string>();
        }

        return (List<string>)ViewState["labels"];
    }
}

In the next step, I added int variables for checking how many ids are on lists, for ex.

  private int LastIDLabels
{
    get
    {
        return LabelsList.Count;
    }
}

In step three I wrote general code to Load ViewState, and for Buttons actions to add and removed controls.

 protected override void OnPreInit(EventArgs e)
{
    base.OnPreInit(e);
}

protected override void LoadViewState(object savedState)
{
    base.LoadViewState(savedState);

    for (int i = 0; i < ControlsList.Count; i++)
    {
        Label InstrukcjaList = new Label();
        InstrukcjaList.ID = LabelsList[i];
        InstrukcjaList.Width = 200;
        InstrukcjaList.Height = 32;
        int b = i + 2;
        InstrukcjaList.Text = "Wprowadź treść pytania " + b;
        InstrukcjaList.CssClass = "labelTwo";
        InstrukcjaList.Style.Value = "color: white;";

        TextBox PytanieList = new TextBox();
        PytanieList.ID = ControlsList[i];
        PytanieList.Width = 350;
        PytanieList.Height = 28;
        PytanieList.Font.Size = 10;
        PytanieList.Style.Value = "margin-right: 5px;";

        Button DodajOdpList = new Button();
        DodajOdpList.ID = ListaDodaj[i];
        DodajOdpList.Width = 20;
        DodajOdpList.Height = 20;
        DodajOdpList.Font.Size = 7;
        DodajOdpList.Text = "+";
        DodajOdpList.ToolTip = "Dodaj odpowiedź do pytania";
        DodajOdpList.Style.Value = "background-color: green; color: white;";
        //DodajOdpList.Attributes.Add("OnClick", "DodajOdp_Click");

        Button UsunOdpList = new Button();
        UsunOdpList.ID = ListaUsun[i];
        UsunOdpList.Width = 20;
        UsunOdpList.Height = 20;
        UsunOdpList.Font.Size = 7;
        UsunOdpList.Text = "-";
        UsunOdpList.ToolTip = "Usuń odpowiedź";
        UsunOdpList.Style.Value = "background-color: red; color: white;";
        //UsunOdpList.Attributes.Add("OnClick", "UsunOdp_Click");

        PlaceHolder PHListOdp = new PlaceHolder();
        PHListOdp.ID = ListaPHOdp[i];

        PlaceHolder1.Controls.Add(InstrukcjaList);
        PlaceHolder1.Controls.Add(PytanieList);
        PlaceHolder1.Controls.Add(DodajOdpList);
        PlaceHolder1.Controls.Add(UsunOdpList);
        PlaceHolder1.Controls.Add(new LiteralControl("<br/>"));
        PlaceHolder1.Controls.Add(PHListOdp);
        PlaceHolder1.Controls.Add(new LiteralControl("<br/>"));

        Label OdpowiedzList = new Label();
        OdpowiedzList.ID = ListaTrescOdp[i];
        OdpowiedzList.Width = 200;
        OdpowiedzList.Height = 32;
        OdpowiedzList.Text = "Wprowadź odpowiedź 1";
        OdpowiedzList.CssClass = "labelOne";
        OdpowiedzList.Style.Value = "margin-left: 50px;";

        TextBox WartoscOdpLista = new TextBox();
        WartoscOdpLista.ID = ListaWartoscOdp[i];
        WartoscOdpLista.Width = 350;
        WartoscOdpLista.Height = 28;
        WartoscOdpLista.Font.Size = 10;
        WartoscOdpLista.Style.Value = "margin-right: 5px;";

        CheckBox CheckBoxLista = new CheckBox();
        CheckBoxLista.ID = ListaCheckOdp[i];
        CheckBoxLista.ToolTip = "Zaznacz jeżeli prawidłowa odpowiedź";
        /*PlaceHolder PHNewID = new PlaceHolder();
        PHNewID.ID = "PH" + i;
        PHNewID.Controls.Add(OdpowiedzList);*/

        PHListOdp.Controls.Add(OdpowiedzList);
        PHListOdp.Controls.Add(WartoscOdpLista);
        PHListOdp.Controls.Add(CheckBoxLista);

    }
}
protected void Button3_Click(object sender, EventArgs e)
{

    Label InstrukcjaList = new Label();
    InstrukcjaList.ID = "Instrukcja" + NextID.ToString();
    InstrukcjaList.Width = 200;
    InstrukcjaList.Height = 32;
    int c = NextID + 1;
    InstrukcjaList.Text = "Wprowadź treść pytania " + c.ToString();
    InstrukcjaList.CssClass = "labelTwo";
    InstrukcjaList.Style.Value = "color: white;";
    LabelsList.Add(InstrukcjaList.ID);

    TextBox PytanieList = new TextBox();
    PytanieList.ID = "Pytanie" + NextID.ToString();
    PytanieList.Width = 350;
    PytanieList.Height = 28;
    PytanieList.Font.Size = 10;
    PytanieList.Style.Value = "margin-right: 5px;";

    Button DodajOdpList = new Button();
    DodajOdpList.ID = "DodajOdp" + NextID.ToString();
    DodajOdpList.Width = 20;
    DodajOdpList.Height = 20;
    DodajOdpList.Font.Size = 7;
    DodajOdpList.Text = "+";
    DodajOdpList.ToolTip = "Dodaj odpowiedź do pytania";
    DodajOdpList.Style.Value = "background-color: green; color: white;";
    DodajOdpList.Click += new EventHandler(DodajOdp_Click);
    ListaDodaj.Add(DodajOdpList.ID);

    Button UsunOdpList = new Button();
    UsunOdpList.ID = "UsunOdp" + NextID.ToString();
    UsunOdpList.Width = 20;
    UsunOdpList.Height = 20;
    UsunOdpList.Font.Size = 7;
    UsunOdpList.Text = "-";
    UsunOdpList.ToolTip = "Usuń odpowiedź";
    UsunOdpList.Style.Value = "background-color: red; color: white;";
    UsunOdpList.Click += new EventHandler(UsunOdp_Click);
    ListaUsun.Add(UsunOdpList.ID);



    PlaceHolder PHListOdp = new PlaceHolder();
    PHListOdp.ID = "PH" + NextID.ToString();
    ListaPHOdp.Add(PHListOdp.ID);

    PlaceHolder1.Controls.Add(InstrukcjaList);
    PlaceHolder1.Controls.Add(PytanieList);
    PlaceHolder1.Controls.Add(DodajOdpList);
    PlaceHolder1.Controls.Add(UsunOdpList);
    PlaceHolder1.Controls.Add(new LiteralControl("<br/>"));
    PlaceHolder1.Controls.Add(PHListOdp);
    PlaceHolder1.Controls.Add(new LiteralControl("<br/>"));
    ControlsList.Add(PytanieList.ID);

    Label OdpowiedzList = new Label();
    OdpowiedzList.ID = "PH" + LastIDPH.ToString() + "L0";
    OdpowiedzList.Width = 200;
    OdpowiedzList.Height = 32;
    OdpowiedzList.Text = "Wprowadź odpowiedź 1";
    OdpowiedzList.CssClass = "labelOne";
    OdpowiedzList.Style.Value = "margin-left: 50px;";
    ListaTrescOdp.Add(OdpowiedzList.ID);

    TextBox WartoscOdpLista = new TextBox();
    WartoscOdpLista.ID = "PH" + LastIDPH.ToString() + "TB0";
    WartoscOdpLista.Width = 350;
    WartoscOdpLista.Height = 28;
    WartoscOdpLista.Font.Size = 10;
    WartoscOdpLista.Style.Value = "margin-right: 5px;";
    ListaWartoscOdp.Add(WartoscOdpLista.ID);

    CheckBox CheckBoxLista = new CheckBox();
    CheckBoxLista.ID = "PH" + LastIDPH.ToString() + "CB0";
    CheckBoxLista.ToolTip = "Zaznacz jeżeli prawidłowa odpowiedź";
    ListaCheckOdp.Add(CheckBoxLista.ID);

    PHListOdp.Controls.Add(OdpowiedzList);
    PHListOdp.Controls.Add(WartoscOdpLista);
    PHListOdp.Controls.Add(CheckBoxLista);
}

protected void Button4_Click(object sender, EventArgs e)
{
    ListaCheckOdp.Remove("PH" + LastIDPH.ToString() + "CB0");
    ListaWartoscOdp.Remove("PH" + LastIDPH.ToString() + "TB0");
    ListaTrescOdp.Remove("PH" + LastIDPH.ToString() + "L0");
    PlaceHolder1.Controls.Remove(new LiteralControl("<br/>"));
    ListaPHOdp.Remove("PH" + LastIDPH.ToString());
    PlaceHolder1.Controls.Remove(new LiteralControl("<br/>"));
    ListaDodaj.Remove("DodajOdp" + LastIDDodajOdpButton.ToString());
    ListaUsun.Remove("UsunOdp" + LastIDUsunOdpButton.ToString());
    ControlsList.Remove("Pytanie" + LastID.ToString());
    LabelsList.Remove("Instrukcja" + LastIDLabels.ToString());
}

I know that the code is not too good, but I'm a newbie c# programmer. This code works perfectly. Unfortunately, I have many problems with the second part of the code.

When I induced action from Button3_Click, I will get forms with,
Label, TextBox, two Buttons, PlaceHolder, Label, TextBox and CheckBox.

The most important controls from these are PlaceHolder, AddAnswer and DeleteAnswer Buttons.

AddAnswer object looks like this

  protected void DodajOdp_Click(object sender, EventArgs e)
{
    Button btnDO = (Button)sender;
    string id = btnDO.ID;

    for (int i = 0; i <= ListaPHOdp.Count; i++)
    {
        if (id == "DodajOdp" + i.ToString())
        {

            Label OdpowiedzList = new Label();
            OdpowiedzList.ID = "PH" + i.ToString() + "L1"; //+ OstatnieIDInstrukcjiOdpowiedzi.ToString();
            OdpowiedzList.ID = "PH0L1";
            OdpowiedzList.Width = 200;
            OdpowiedzList.Height = 32;
            OdpowiedzList.Text = "Wprowadź odpowiedź ";// + OstatnieIDInstrukcjiOdpowiedzi.ToString();
            OdpowiedzList.CssClass = "labelOne";
            OdpowiedzList.Style.Value = "margin-left: 50px;";
            ListaOdpowiedzidlaPytania.Add(OdpowiedzList.ID);

            PH0.Controls.Add(OdpowiedzList);
        }
    }
}

It almost works, but only for one PlaceHolder ID, in this case, is PH0. I know that I added this one in code, but I tried many solutions to changed it.

The first question is. How changed this scrap of code PH0.Controls.Add(OdpowiedzList); to get ids dependent from buttons ids?

The second question is. How to add the DodajOdp_Click object to all new buttons with id started from "DodajOdp"?

I hope is it clear for you. Maybe someone can help me with that.

0

There are 0 best solutions below