Генерация динамических элементов управления в динамическом заполнителе C # - PullRequest
0 голосов
/ 06 декабря 2018

Я сделал код для динамического создания элементов управления, используя заполнитель.Эта программа генерирует простую форму для создания опросов.Структура программы состоит из двух частей.Первая часть динамически создает множество элементов управления, включая PlaceHolders.Для лучшего понимания я добавил клочки кода.

Сначала я создал несколько личных списков, например.

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

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

На следующем шаге я добавил переменные типа int для проверки количества идентификаторов в списках, например.

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

На третьем шаге я написал общий код для Load ViewState и для действий кнопок для добавления и удаления элементов управления.

 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());
}

Я знаю, что код не слишком хорош, но я новичок в программировании на c #.Этот код работает отлично.К сожалению, у меня много проблем со второй частью кода.

Когда я вызвал действие из Button3_Click, я получу формы с
Label, TextBox, двумя кнопками, PlaceHolder, Label, TextBox и CheckBox.

Наиболее важными элементами управления из них являются кнопки PlaceHolder, AddAnswer и DeleteAnswer.

Объект AddAnswer выглядит следующим образом

  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);
        }
    }
}

Он почти работает, но только для одного идентификатора PlaceHolder, в данном случае, PH0.Я знаю, что я добавил это в код, но я пытался много решений, чтобы изменить его

Первый вопрос.Как изменился этот фрагмент кода PH0.Controls.Add (OdpowiedzList);получить идентификаторы в зависимости от идентификаторов кнопок?

Второй вопрос.Как добавить объект DodajOdp_Click ко всем новым кнопкам с идентификатором, запущенным из «DodajOdp»?

Надеюсь, вам понятно.Может быть, кто-то может помочь мне с этим.

...