Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

generate web controls

Îåêßíçóå áðü ôï ìÝëïò koraki_g. Τελευταία δημοσίευση από το μέλος dimik στις 07-07-2008, 17:47. Υπάρχουν 17 απαντήσεις.
Σελίδα 1 από 2 (18 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  05-05-2008, 17:50 41799

    generate web controls

    Καλησπέρα, πρώτη φορά γράφω σε αυτό το φόρουμ και είναι για να ζητήσω βοήθεια, ελπίζω να την έχω...
    Θέλω να δημιουργήσω μια σελίδα που θα κάνει ένα νέο label κάθε φορά που θα κάνω click σε ένα κουμπί και θα το προσθέτει στο τέλος του πάνελ, κάτω απο όλα τα προηγούμενα που έχουν δημιουργηθεί.

    Ας πούμε ότι έχω αυτό το κουμπί ( C# ):

     <asp:Panel runat="server" ID="pnlLabels" >
         <asp:ImageButton ID="AddNewlabel" runat="server" ImageUrl="onemore.jpg" Width="26" Height="26" OnClick="AddNewlabel_Click" />
      </asp:Panel>

    και στον κώδικα απο πίσω έχω το εξής :

     protected void AddNewlabel_Click(object sender, ImageClickEventArgs e)
      {
         Random randomNumber = new Random();
         Label newLabel = new Label();
         newLabel.Text = randomNumber.Next();
         pnlProcesses.Controls.Add(newLabel);
    }

    Κάθε φορά που φορτώνεται η σελίδα δημιουργεί νέο control αλλά το βάζει στη θέση του παλιού.
    Γιατί γίνεται αυτο;

    Έλεγξα αν φταίει το PostBack αλλά δεν βρήκα διαφορά, όπως και με PlaceHolder αντί για πάνελ.



    Δημοσίευση στην κατηγορία:
  •  06-05-2008, 01:50 41806 σε απάντηση της 41799

    Απ: generate web controls

    ... αυτό που συμβαίνει είναι το εξής.

    Κάθε φορά που εκτελείται η σελίδα σου, σε κάθε postback δηλαδή, δεν θυμάται τα controls τα οποία έχεις προσθέσει εσύ δυναμικά - αυτά που δεν εμφανίζονται δηλαδή μέσα στο .aspx αρχείο σου. Αυτή είναι η κανονική συμπεριφορά της σελίδας. Οπότε, σε κάθε postback, πρέπει να δημιουργείς και να κάνεις Add στο Panel σου όλα τα labels που θές.

    θα σου πρότεινα να δημιουργήσεις ένα List, Array ή κατι τέτοιο, στο οποίο θα αποθηκεύεις τα περιεχόμενα του κάθε label απευθείας, και μετά με ένα foreach θα δημιουργείς κάθε φορά όλα τα labels - σώζοντας την αρχική λίστα στο viewstate, και ούτω καθ' εξής ...

    [ Προσοχή όμως. Αυτό θα παίξει μια χαρά για ένα αρκετά μεγάλο νούμερο απο items μέσα στη λίστα. Έχε στο νού σου όμως ότι καθετί που σώζεις στο viewstate μεγαλώνει το μέγεθος της σελίδας σου ανάλογα. Μη βρεθείς με καμμία σελίδα 300Κ ]

    Angel
    O:]
  •  06-05-2008, 09:57 41811 σε απάντηση της 41806

    Απ: generate web controls

    Ευχαριστώ anjelinio η λύση με τη λίστα είναι καλή...

    Αν δεν κάνω λάθος όμως το ViewState υπάρχει και για να αποθηκεύει τα controls που του προσθέτω εγώ στη σελίδα.

    Ψάχνω να βρώ γιατί σβήνονται, αν κατάλαβα καλά εννοείς ότι η σελίδα άπαξ και φορτωθεί δεν δέχεται άλλα controls στα Postback;
    Οπότε εκτός απο το ViewState εγώ πρέπει να κρατάω και κάπου αλλού τα controls που έχω προσθέσει.

    Επίσης σε ένα επόμενο επίπεδο όπου αντί για label προσθέτω Buttons και θέλω να έχω Events πως θα το κάνω;
  •  06-05-2008, 11:27 41815 σε απάντηση της 41811

    Απ: generate web controls

    Το viewstate υπάρχει για να αποθηκεύει δεδομένα, όχι controls. Η σελίδα ξέρει τα controls που πρέπει να κάνει render αποκλειστικά απο το .aspx αρχείο. Αυτό με τη σειρά του σημαίνει ότι οποιοδήποτε control προστεθεί "δυναμικά" απο εσένα, στο επόμενο postback η σελίδα το ξεχνάει.

    Πρέπει να τα ξαναπροσθέτεις όλα, κάθε φορά. Δυστυχώς ... αλλά έτσι είναι :)

    Όταν αρχίσεις να προσθέτεις buttons, θα πρέπει να κάνεις register τους event handlers τους με το χέρι, τη στιγμή που τα προσθέτεις κι αυτά στη σελίδα.

    Angel
    O:]
  •  06-05-2008, 11:33 41817 σε απάντηση της 41815

    Απ: generate web controls

    Σε ευχαριστώ πολύ!
  •  06-05-2008, 11:39 41818 σε απάντηση της 41811

    Απ: generate web controls

    koraki_g το έχεις παρανοήσει λιγάκι. Το viewstate δεν αποθηκεύει τα controls που προσθέτεις στην σελίδα αλλά το viewstate τους. Μια σελίδα ξαναδημιουργείται από την αρχή κάθε φορά που την καλείς. Όπως φτιάχνεις εσύ δυναμικά ένα control στην σελίδα με τον ίδιο τρόπο φτιάχνει και η asp .net τα υπόλοιπα. Αν ήταν έτσι όπως τα λές τότε σε κάθε postback θα είχες +1 σε καθε control της σελίδας. Άρα αυτό που σου λέει ο anjelino είναι να προσθέτεις κάπου σε ένα χώρο αποθήκευσης(session, viewstate) πόσα control χρειάζεται να δημιουργήσεις κάθε φορά.


    View Παναγιώτης Χαραλάμπους's profile on LinkedIn
    Coding at Mediterranean Acoustics
  •  06-05-2008, 11:39 41819 σε απάντηση της 41818

    Απ: generate web controls

    Ωπς με πρόλαβε!


    View Παναγιώτης Χαραλάμπους's profile on LinkedIn
    Coding at Mediterranean Acoustics
  •  06-05-2008, 16:10 41827 σε απάντηση της 41819

    Απ: generate web controls

    Επανέρχομαι για να ρωτήσω το εξής :
    έχω βάλει στο PReRender  της σελίδας τον παρακάτω κώδικα:

     if (Session["countDDL"] != null && int.Parse(Session["countDDL"].ToString()) > 0)
                {
                    for (int i = 0; i < int.Parse(Session["countDDL"].ToString()); i++)
                    {
                        DropDownList dropDown1 = new DropDownList();
                        ListItem lsi = new ListItem("Επιλέξτε απο τα παρακατω");
                       
    dropDown1 .ID = i.ToString();
                       
    dropDown1 .Width = 150;
                       
    dropDown1 .Items.Add(lsi);
                       
    dropDown1 .AutoPostBack = true;
                       
                        Button bt = new Button();
                        bt.ID = "testbutton";
                        bt.Text = "test";
                        bt.Click += new EventHandler(bt_Click);
                        FillList(
    dropDown1 );

                       
    dropDown1 .SelectedIndexChanged += new EventHandler(dropDown1_SelectedIndexChanged);
                        pnl
    dropDowns.Controls.Add(dropDown1 );
                       
                       
    pnldropDowns.Controls.Add(bt);
                    }
                }

    και έχω βάλει σε ένα κουμπί να αυξάνεται ο αριθμός του
    Session["countDDL"] κάθε φορά που το πατήσει ο χρήστης.

    Δυστυχώς δεν βλέπω φως με τα Events, δεν τρέχει κανένα.

    Μήπως πρέπει να κρατάω κάπου τα Controls πριν το PostBack;
    Mήπως χάνεται το Event;

  •  06-05-2008, 21:06 41832 σε απάντηση της 41827

    Απ: generate web controls

    Οκ, γρήγορη αναδρομή στο lifecycle μιας σελίδας ...

    Ένα WebForm, είναι στο server ενα object. Όταν "ξεκινάει" ένα request - έρχεται δηλαδή η κλήση στο server - δημιουργείται ένα instance, και εκτελείται για να παράγει το τελικό αποτέλεσμα -> το html που θα επιστραφεί στο browser. Μετά, το instance πεθαίνει [ όχι απαραίτητα, αλλά θεώρησε το έτσι για τώρα ]

    Κατά τη διάρκεια της εκτέλεσης της σελίδας, γράφεις κώδικα στο code behind για να πιάσεις κάποια events τα οποία πετάγονται, και μέσω των event handlers αυτών κάνεις ότι θες να κάνεις. Πάνω κάτω, η σειρά είναι η εξής:

    • PreInit
    • Init
    • PreLoad
    • Load
    • <Event Handlers για τα controls σου>
    • PreRender

    Αυτό έχει το ενδιαφέρον side-effect, ότι για να πιάσεις ένα event απο ένα control το οποίο έχει γίνει δυναμικά add στη σελίδα, πρέπει να κάνεις register τον αντίστοιχο event handler πρίν σκάσουν τα events απο controls - πριν το load δηλαδή.

    Δοκίμασε να κάνεις add τα controls σου στο Init, και εκεί register τους event handlers, κάθε φορά. Νομίζω έτσι θα σου παίξει. Αν το κάνεις στο PreRender, αυτά τα events απο το button σου δε θα πεταχτούν ... ποτέ. Μην ξεχνάς, κάθε καινούργιο request, είναι ένα καινούργιο instance της σελίδας το οποίο δεν ξέρει τίποτα για οτιδήποτε δυναμικό είχε το προηγούμενο request - ειδικά δυναμικά controls και event handlers ! :D 

    Καλή τύχη φίλε :)


    Angel
    O:]
  •  07-05-2008, 13:32 41846 σε απάντηση της 41832

    Απ: generate web controls

    Γεια και πάλι,

    Το τελικό σχέδιο είναι κάπως έτσι :

    Θέλω να προσθέτω άλλο ένα DropDownList σε ένα panel  μόνο όταν ο χρήστης πατήσει το κουμπί "Add New" και να προσθέτω έναν event handler CheckedChanged στο control.

    Επίσης θέλω να υπάρχει το viewstate απο κάθε dropdownlist που έχω ήδη προσθέσει απο προηγούμενα postback και να τα χρησιμοποιώ όταν πατηθεί το κουμπί "Submit" (ένα άλλο κουμπί).
    Κατέληξα σε αυτή τη λύση η οποία δεν με ικανοποιεί όμως :

    PageInit 

     

    if (Session["countDDL"] == null)
    Session["countDDL"] = 0;
    Session["countDDL"] = int.Parse(Session["countDDL"].ToString()) + 1;
    for (int i = 0; i < int.Parse(Session["countDDL"].ToString()); i++)
    {
    DropDownList processes = new DropDownList();
    ListItem lsi = new ListItem("Choose ");
    processes.ID = "processes" + i.ToString();
    processes.Width = 150;
    processes.Items.Add(lsi);
    processes.AutoPostBack = true;
    FillList(processes);

    processes.SelectedIndexChanged += new EventHandler(processes_SelectedIndexChanged);
    pnlProcesses.Controls.Add(processes);
    }

     Δημιουργώ και γεμίζω τα dropdownlists που υπάρχουν συν ένα. Το Viewstate δουλεύει μια χαρά αν έχουν το ίδιο ID.


    PageLoad

     

    Session["buttonAddNewPressed"] = false;

     

    Reset Session key.

     

    protected void AddNewProcess_Click(object sender, ImageClickEventArgs e)
    {
    Session["buttonAddNewPressed"] = true;
    }

     

    protected void Page_PreRender(object sender, EventArgs e)
    {
    if ((bool)Session["buttonAddNewPressed"] == false)
    {
    pnlProcesses.Controls.RemoveAt(pnlProcesses.Controls.Count -1);
    Session["countDDL"] = int.Parse(Session["countDDL"].ToString()) - 1;
    }

    }

    Αν το κουμπί "Add New" δεν πατηθεί σβήνω το τελευταίο dropdownlist γιατί κάποιο άλλο event έγινε και μειώνω τον μετρητή των dropdownlist κατά ένα.

    Η ερώτησή μου είναι :

    Υπάρχει καλύτερη λύση;

    Μου φαίνεται λίγο περίεργο να δημιουργώ ένα control και μετά να το σβήνω...

    Αυτό γίνεται διότι το "Add New" Event γίνεται μεταξύ Page_Load and PreRender αλλά και τα dropdownlist πρέπει να γίνουν μεταξύ αυτών των βημάτων για να γίνουν register οι handlers των dropdownlist. 


    Ευχαριστώ για το ενδιαφέρον απο όλους,
    koraki_g
    Δημοσίευση στην κατηγορία:
  •  07-05-2008, 14:30 41850 σε απάντηση της 41846

    Απ: generate web controls

    Χμμ ... δε μας γράφεις όλο το σενάριο σου; Τι θες τελικά να κάνεις δηλαδή, κι όχι τα προβλήματα με τη λύση που σκέφτηκες; Απο ότι φαίνεται, η συγκεκριμένη λύση είναι .. προβληματική, αλλά κανείς δε μπορεί να πεί με σιγουριά χωρίς να ξέρει το πρόβλημα. Απο ότι φαίνεται όμως ως τώρα, προσπαθείς να ξανα-ανακαλύψεις διάφορους τροχούς ...

    Angel
    O:]
  •  07-05-2008, 14:41 41851 σε απάντηση της 41850

    Απ: generate web controls

    Μάλιστα, έχεις δίκιο.

    Ένα παράδειγμα χρήσης θα μπορούσε να είναι το εξής :

    Η αναζήτηση διάφορων οχημάτων σε ένα ηλεκτρονικό κατάστημα, όπου αν θέλει κάποιος μπορεί να συμπεριλάβει διάφορες μάρκες στην αναζήτηση, οπότε διαλέγει απο τη λίστα την  πρώτη μάρκα επιλογής και στη συνέχεια αν θέλει πατάει το κουμπί "Add New" για να προσθέσει άλλη μια λίστα έτσι ώστε να έχει άλλη μια μάρκα οχήματος στην αναζήτηση.

    Θέλω η πρώτη λίστα αν είχε επιλέξει ο χρήστης "Opel" να παραμένει και να επιλέξει στη δεύτερη "Mercedes" οπότε έτσι να έχει δύο μάρκες όταν θα πατήσει το Search.

    Δεν ξέρω αν σε κατατόπισα...
  •  07-05-2008, 17:52 41854 σε απάντηση της 41851

    Απ: generate web controls

    Α γειά σου ... τώρα μιλάς σωστά Smile

    Υποθέτω τώρα ότι μετά τη μάρκα ακολουθεί μοντέλο κτλ κτλ και άλλα κριτήρια εξαρτόμενα απο την αρχική επιλογή σωστά;

    Οπότε, εγώ θα έφτιαχνα ένα DataSet με ένα DataTable το οποίο έχει Columns για κάθε υποκριτήριο, και θα το έκανα bind σε κάποιο ListView με template controls. Έτσι θα μπορούσες για κάθε row στο DataTable να έχεις το UI που χρειάζεσαι.

    Το DataSet μπορείς να το σώσεις σε ViewState, Session ή οπουδήποτε τελοσπάντων, και στο τέλος, όταν πατήσει το "Search" ο φίλος, να το περνάς σε κάποια μέθοδο η οποία αναλαμβάνει να φτιάξει το/τα queries σου απο τα rows.

    Αν την πρώτη φορά εκεί που δημιουργείς το DataSet & DataTable βάζεις κι ένα κενό row, θα έχεις έτοιμη την πρώτη γραμμή της αναζήτησης με κενά values, άρα και το "πρώτο" UI row για να ξεκινήσει ο χρήστης.

    Κι ούτε δυναμικά controls, ούτε τίποτα Smile

    Πες μας πως πήγε αν ακολουθήσεις αυτή την οδό

    Angel
    O:]
  •  08-05-2008, 09:48 41864 σε απάντηση της 41854

    Απ: generate web controls

    Βασικά ακόμα δουλεύω σε .NET v.2.0 και επειδή δεν επιτρέπεται να αλλάξω δεν ξέρω αν γίνεται να χρησιμοποήσω το ListView Control.

    Ίσως να έχεις δίκιο και να μην χρειάζεται η δυναμική προσέγγιση που έκανα μέχρι τώρα, το θέμα είναι ότι θέλω να φορτώνω αντί για dropdownlist μάρκες αυτοκινήτων το UserControl1 και μέσα του φορτώνω το UserControl2 και θέλω να επιτρέπεται η προσθήκη μέσα στο UserControl1 κι άλλα UserControl2 αλλά και να μπορεί να προσθέτει μέσα στη σελίδα κι άλλα UserControl1.

    Θα το σκεφτώ απο μια άλλη διαφορετική ματιά πιο Web διότι αυτή είναι κλασική Windows Forms τακτική πιστεύω.

    Ευχαριστώ για το ενδιαφέρον,
    koraki_g

    ΥΓ. : Αυτό το έκλεψα απο το blog σου επειδή μου άρεσε πολύ.
    (Κάποιες φορές πιστεύω ότι αντικαθιστούμε την ψυχοθεραπεία με σιωπηλές κωδικογραφημένες κραυγές στο μηνυματάκι του MSN μας.
  •  08-05-2008, 13:49 41865 σε απάντηση της 41864

    Απ: generate web controls

    ListView, DataView, something view ρε παιδί μου κάτι αντίστοιχο έχει και το απλό ASP.NET 2.0 φαντάζομαι Smile




    Y.Γ .. ευχαριστώ και για τη διαφήμιση Big Smile

    Angel
    O:]
Σελίδα 1 από 2 (18 εγγραφές)   1 2 >
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems