Odwołania do dynamicznie utworzonych kontrolek, obsługa formularza.

Odpowiedz Nowy wątek
2012-06-10 17:57

Rejestracja: 8 lat temu

Ostatnio: 7 lat temu

0

Witam, moja aplikacja generuje formularz na podstawie bazy danych.
Do formularza dodaje kontrolki Labels, TextBox oraz RadioButton.
Na stronie dostaję coś takiego (fragment) :

...
<span id="lblPytanie0">1. Jakie masz wykształcenie ?</span><br>
</br><input id="radio00" type="radio" name="0" value="asd" /><span id="odpwiedz00">Podstawowe</span><br>
</br><input id="radio01" type="radio" name="0" value="asd" /><span id="odpwiedz01">Średnie</span><br>
</br><input id="radio02" type="radio" name="0" value="asd" /><span id="odpwiedz02">Wyższe</span><br>
...

(wartość value będzie ustawiona docelowo inaczej - na wartość niepowtarzalną)

Kontrolki do formy dodaje w ten sposób (fragment):

RadioButton radioOdpowiedz = new RadioButton();
radioOdpowiedz.ID = "radio" + i.ToString() + j.ToString();
radioOdpowiedz.Attributes.Add("value","asd");
radioOdpowiedz.GroupName = i.ToString();
tresc.Controls.Add(radioOdpowiedz);

(kontrolki dodawane są w pętli, stąd zmienne i, j)

  1. Chciałbym aby po wypełnieniu formularza przez użytkownika, mógł przeprowadzić walidacje,
    kontrolek aby sprawdzić czy udzielono odpowiedzi na wszystkie pytania.
    Jak odwołać się w kodzie do kontrolek które zostaną dopiero wygenerowane podczas działania aplikacji ?

  2. Jak mogę odebrać formularz (w jakim obiekcie jest przechowywany) po stronie serwera po kliknięciu na przycisk, kiedy strona jest wysyłana do serwera ?

Pozostało 580 znaków

2012-06-10 18:52
Moderator

Rejestracja: 11 lat temu

Ostatnio: 2 godziny temu

Lokalizacja: Wrocław

0

Zakładam, że wątek dotyczy ASP.NET/WebForms.

  1. Klasa Page ma metodę FindControl, która pozwala znaleźć kontrolkę po jej ID.
  2. W zdarzeniu obsługującym kliknięcie przycisku (musisz je oczywiście dodać) możesz się odwoływać do kontrolek formularza.

"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2012-06-10 20:19

Rejestracja: 8 lat temu

Ostatnio: 7 lat temu

0

Pod procedurę obsługi kliknięcia przycisku, dodaję kod:

 if (PreviousPage != null)
 {
     RadioButton radio = (RadioButton)PreviousPage.FindControl("radio00");
 }

Podglądając źródło strony wiem że na pewno w konkretnym przypadku, RadioButton o takim ID znajduję się na stronie.
Próbowałem także zamiast PreviousPage wykorzystać Page i także nic się nie dzieje, to znaczy do obiektu radio nie jest
przypisywany obiekt RadioButton znaleziony na stronie.

Próbowałem podpiąć ten kod pod obsługę zdarzenia Page_Load z takim samym skutkiem.

Pozostało 580 znaków

2012-06-10 20:55
Moderator

Rejestracja: 11 lat temu

Ostatnio: 2 godziny temu

Lokalizacja: Wrocław

0

Ta kontrolka ma oczywiście ustawione runat="server"?


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2012-06-10 21:15

Rejestracja: 8 lat temu

Ostatnio: 7 lat temu

0

Dobre pytanie :)
Chciałem ustawić właściowść runat="server" w sposób :

radioOdpowiedz.Attributes.Add("runat","server");

Powyższy kod był wstawiony, między kodem ustawiającym właściwość ID itp. (kod w pierwszym poście)
Niestety właściwość runat="server" był wstawiany do elementu span otaczającego RadioButtona:

</br><span runat="server"><input id="radio00" type="radio" name="0" value="asd" /></span><span id="odpwiedz00">Podstawowe</span><br>

Przy okazji pytanie, jak ustawić tą właściwość dla RadioButtona aby było wstawione do znacznika input ?
W przypadku ustawiania właściwości runat="server" dla TextBoxa, efekt jest prawidłowy, tzn. właściwośc jest wstawiana w odpowiednie miejsce,
jednak dla tego obiektu także nie działa wyszukiwanie przez FindControl():/

Ewentualnie jak pobrać kontrolki z formularza bez ustawionej właściwości runat="server" ?

Co ciekawe kiedy ręcznie dodam kontrolkę do strony:

<asp:TextBox ID="textBox12" runat="server" Text=""></asp:TextBox>

i jest ona obecna już przy uruchamianiu strony, kod wykonany po kliknięciu przycisku:

Control text = (Control)Page.FindControl("textBox12");

znajduję kontrolkę i przypisuję ja do obiektu text.

Zauważyłem też, że po dodaniu kontrolki do formy jak wyżej, w kodzie strony wygląda ona tak:

<input name="textBox12" type="text" id="textBox12" />

a więc dodawanie przeze mnie parametru runat="server" w ten sposób jest chyba błędne ?

edytowany 2x, ostatnio: piotrekg1987, 2012-06-10 23:07

Pozostało 580 znaków

2012-06-11 00:11
Moderator

Rejestracja: 11 lat temu

Ostatnio: 2 godziny temu

Lokalizacja: Wrocław

0

Bo asp:TextBox czy asp:RadioButton to nie są zwykłe inputy tylko kontrolki serwerowe, więc nie wiem czy coś Ci da wstawienie do nich na siłę runat="server" do zwykłego inputa.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2012-06-11 00:24

Rejestracja: 8 lat temu

Ostatnio: 7 lat temu

0

No na to wychodzi, bo w przeglądarce, nawet kontrolka serwerowa nie ma już w sobie parametru runat="server", jak podałem wyżej w przykładzie.
Z drugiej strony jeśli tworze obiekt typu TextBox (który jest defacto obiektem związanym z platformą .net) i dodaje go do forma, to wydaje mi się że
domyślnie ten obiekt powinien mieć ustawiony parametr runat="server", tak jak przy "przeciągnięciu" kontrolki TextBox na forma.
Jednak kontrolkę taką mogę pobrać przez FindControl(), a dodanych dynamicznie jak w powyższym kodzie, już nie znajduję:/

Pozostało 580 znaków

2012-06-11 00:28
Moderator

Rejestracja: 11 lat temu

Ostatnio: 2 godziny temu

Lokalizacja: Wrocław

0
piotrekg1987 napisał(a):

No na to wychodzi, bo w przeglądarce, nawet kontrolka serwerowa nie ma już w sobie parametru runat="server", jak podałem wyżej w przykładzie.

Skąd wiesz?
Wiesz na ile i jakich elementów HTML renderowana jest kontrolka serwerowa? Bo z poprzednich postów nie wynika, żebyś wiedział.

Co do odwoływania do dynamicznie tworzonych elementów, to teraz nie mam czasu sprawdzić jak to się robi. Spróbuję jutro, o ile nikt Ci nie pomoże wcześniej.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2012-06-11 00:47

Rejestracja: 8 lat temu

Ostatnio: 7 lat temu

0

Widzę jak to wygląda po wyrenderowaniu strony, podglądając źródło. Tam wszystkie TextBoxy i RadioButony są reprezentowane przez klasyczne HTML-owe inputy bez parametru runat="server" niezależnie czy dodałem je do formy dynamicznie czy ręcznie. Oczywiście nie znam wszystkich szczegółów co dzieje się podczas renderowania strony, ale kod wynikowy po stronie przeglądarki widzę. Jednak musi być jakaś różnica w dodawaniu tych elementów dynamicznie a ręcznie, ponieważ do ręcznie dodanej kontrolki jest dostęp przez FindControl().

Pozostało 580 znaków

2012-06-11 01:31
Moderator

Rejestracja: 11 lat temu

Ostatnio: 2 godziny temu

Lokalizacja: Wrocław

Dobra ja coś namieszałem, zapomnijmy o dodawaniu runat="server" w ogóle, bo to się powinno stać automatycznie.

Takie coś działa - tak po prostu i bez żadnych kombinacji:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication8.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></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Panel ID="Panel1" runat="server">
        </asp:Panel>
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /><br />
        <asp:Label ID="Label1" runat="server" Text="Pusta!"></asp:Label>
    </div>
    </form>
</body>
</html>
using System;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication8
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            for (int i = 0; i < 3; i++)
            {
                TextBox txt = new TextBox();
                txt.ID = "teikste" + i;
                txt.Text = "Jakiś tekst numer " + i;

                this.Panel1.Controls.Add(txt);
                this.Panel1.Controls.Add(new LiteralControl("<br />"));
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 3; i++)
            {
                TextBox txt = this.Panel1.FindControl("teikste" + i) as TextBox;
                sb.AppendLine(txt.Text);
            }

            this.Label1.Text = sb.ToString();
        }
    }
}

Nie masz czasem swojego tworzenia kontrolek wstawionego w ''if(!IsPostBack)"?


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."
edytowany 1x, ostatnio: somekind, 2012-06-11 01:32

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0