29 messaggi dal 25 gennaio 2002
Salve a tutti
dovrei realizzare un sistema di prenotazioni di posti per un piccolo teatro, pensavo di utilizzare una gridview per visualizzare la griglia dei posti , con tre possibili status(venduto,prenotato,libero) , intercettando il click del mouse su ciascuna casella della griglia e esercitare poi un azione collettiva su tutti quelli selezionati dall'utente.ho però dei dubbi per quello che riguarda la possibilità di "marcare" le caselle selezionate senza fare un postback ogni volta
qualcuno ha gia avuto a che fare con un problema simile?
grazie
non è proprio quello che cerchi ma questo articolo dell'inossidabile Dino Esposito ti potrebbe dare qualche dritta.

http://msdn.microsoft.com/msdnmag/issues/06/05/CuttingEdge/default.aspx

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
426 messaggi dal 17 aprile 2006
ciao,
probabilmente Ajax ti sarebbe di aiuto, ma dubito fortemente che tu possa riprodurre una platea di un teatro con un gridview temo proprio che ti dovrai creare uno usercontrol per fatti tuoi o aggirare il problema come segue:
Crea una pagina Platea.aspx in c#
incolla dentro il file Platea.aspx questo codice:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Platea.aspx.cs" Inherits="Platea" %>

<!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="PanelPlatea" runat="server">
    </asp:Panel>
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Salva" />
    </div>
    </form>
</body>
</html>

incolla invece dentro il file Platea.aspx.cs questo codice:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
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 Platea : System.Web.UI.Page
{
    string sPosti = "";
    protected void Page_Init(object sender, EventArgs e)
    {
        fnCreatePosti();
        fnCreatePlatea();
    }

    private void fnCreatePlatea()
    {
        string[] sFile = sPosti.Split('-');
        foreach (string s in sFile)
        {
            string[] sPoltrone = s.Split(';');
            foreach (string sp in sPoltrone)
            {
                if (sp != "")
                {
                    CheckBox cb = fnCreaPoltrona(sp);
                    PanelPlatea.Controls.Add(cb);
                }
            }
            PanelPlatea.Controls.Add(new LiteralControl("<br/>"));

        }
    }

    private CheckBox fnCreaPoltrona(string sPoltrona)
    {
        CheckBox cb = new CheckBox();
        string[] sDettaglioPoltrona = sPoltrona.Split(':');
        cb.ID = "f" + sDettaglioPoltrona[0] + "p" + sDettaglioPoltrona[1];
        if (sDettaglioPoltrona[2] == "1")
            cb.Enabled = false;
        return cb;
    }

    private void fnCreatePosti()
    {
        int libera = 0;
        string sOccupati = "01,05,06,07,14";
        for (int f = 1; f < 10; f++)
        {
            for (int p = 1; p < 15; p++)
            {
                if (sOccupati.Contains(p.ToString("00")))
                    libera = 1;
                else
                    libera = 0;
                sPosti += f.ToString() + ":" + p.ToString("00") + ":" + libera.ToString() + ";";
            }
            sPosti += "-";
        }

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        string sRisultato = "";
        string[] sFile = sPosti.Split('-');
        foreach (string s in sFile)
        {
            string[] sPoltrone = s.Split(';');
            foreach (string sp in sPoltrone)
            {
                if (sp != "")
                {
                    string[] sDettaglioPoltrona = sp.Split(':');
                    try
                    {
                        CheckBox cb = (CheckBox)PanelPlatea.FindControl("f" + sDettaglioPoltrona[0] + "p" + sDettaglioPoltrona[1]);
                        if (cb != null)
                        {
                            if (cb.Checked)
                            {
                                if (sRisultato != "")
                                    sRisultato += "\\r\\n";
                                sRisultato += "Fila: " + sDettaglioPoltrona[0] + " Posto: " + sDettaglioPoltrona[1];
                            }
                        }

                    }
                    catch (Exception)
                    {
                    }
                }
            }
        }
        if (sRisultato == "")
            ClientScript.RegisterClientScriptBlock(this.GetType(), "ris", "alert('nessun posto selezionato')", true);
        else
        {
            sRisultato = "Posti selezionati:\\r\\n" + sRisultato;
            ClientScript.RegisterClientScriptBlock(this.GetType(), "ris", "alert('" + sRisultato + "')", true);
        }

    }
}

l'ho creato al volo e provato dunque funziona ma sicuramente sarebbe da ottimizzare. Per evitare rogne di stringhe di configurazione ho simulato un db creando una stringa sPosti dove metto la mappa dei posti previsti nella platea.
Dentro la funzione fnCreatePosti() simulo la ricezione dei dati dalla mappa del teatro ed ho creato una stringa sOccupati per simulare i posti non disponibili (cioè già presi da altri...)
nel Page_Init creo tanti checkbox quanti sono i posti e quelli occupati saranno disabilitati.

Note tecniche:
il sistema adottato per inserire i checkbox nel panel NON E' QUELLO OTTIMALE perchè prima bisognerebbe creare il CheckBox generico, inserirlo nel pannello e solo dopo assegnare le proprietà (tipo ID o Enabled etc etc) perchè altrimenti non vengono gestiti dal ViewState.

Tuttavia la mia soluzione funziona comunque perchè faccio creare questi checkbox nel Page_Init e non nel page_load e dunque in uno step precedente alla creazione del ViewState.

Altra cosuccia: se questo sistema ti interessa ti posso modificare il codice per non far apparire le checkbox ed al loro posto mostrare tre tipi diversi di immagini (una per il posto libero, una per quello non disponibile, ed una per quello occupato) e con codice javascript selezionare o deselezionare i checkbox.

non ti ho messo subito tale soluzione perchè avrebbe reso il codice meno leggibile e poi non sapevo come passarti le immagini

fammi sapere

Ciao Alessandro
29 messaggi dal 25 gennaio 2002
Innanzitutto grazie
in effetti la soluzione con le immagini è allettante e ti sarei grato ,se non è troppo disturbo, un esempio a riguardo.A livello teorico vorrei sapere come avresti implementato la soluzione con ajax ,considerato che una prerogativa del sistema è quella di avere dei tasti di "raccordo" per riga o colonna che selezionano l'intera riga o colonna(per ora ho in testa un ciclo javascript )
Grazie
426 messaggi dal 17 aprile 2006
sono rientrato solo ora..
per quanto riguarda Ajax poteva essere una soluzione per evitare o meglio mascherare postback che ad ogni modo servivano per scatenare eventi lato server.

ripeto che a mio giudizio il gridview in se stesso non è la soluzione, dunque userei gridview solo come becero contenitore di imagebutton o altro il cui postback venga "trattato" con Ajax

ma è solo tempo ed energia sprecata.

tanto per capirci, un checkbox non ha bisogno di postback per cambiare di stato e taroccando il checkbox nel modo che ti invio nel successivo post (dammi il tempo di realizzarlo) ottieni una soluzione veloce scalabile e configurabile anche in base a mutate esigenze e raffinabile in un usercontrol che in se ha tutto il necessario per funzionare.

dunque a mio modo di vedere snaturare oltremodo il gridview per rendere selezionabili le singole "celle" equivale a non utilizzare affatto il girdview

inizio a taroccare la mia soluzione e te la mando.
tu intanto preparati tre immagini piccoline per identificare le poltrone vuote occupate o riservate che siano e le poltrone che l'utente seleziona

Ciao Alessandro
426 messaggi dal 17 aprile 2006
ti posto la nuova soluzione con le immagini. scusa ma sono stato preso da un problemone e mi sono liberato piuttosto tardi.
incolla dentro il file Platea.aspx questo codice:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Platea.aspx.cs" Inherits="Platea" %>

<!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>
<script type="text/javascript">
        function fnSetCheck(Prefix, checkbox, abilita)
        {
            if(abilita=='true')
            {
                document.getElementById(Prefix+checkbox).checked=true;
                document.getElementById(Prefix+'il'+checkbox).style.display="none";
                document.getElementById(Prefix+'is'+checkbox).style.display="block";
            }
            else
            {
                document.getElementById(Prefix+checkbox).checked=false;
                document.getElementById(Prefix+'is'+checkbox).style.display="none";
                document.getElementById(Prefix+'il'+checkbox).style.display="block";
            }
         
        }

</script>
    <form id="form1" runat="server">
    <div>
    <asp:Panel ID="PanelPlatea" runat="server">
    </asp:Panel>
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Salva" />
    </div>
    </form>
</body>
</html>

incolla dentro Platea.aspx.cs questo:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
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 Platea : System.Web.UI.Page
{
    string sPosti = "";
    string sUrlPostoDisabilitato = "~/Images/postoDisabilitato.gif";
    string sUrlPostoLibero = "~/Images/postoLibero.gif";
    string sUrlPostoSelezionato = "~/Images/postoSelezionato.gif";
    protected void Page_Init(object sender, EventArgs e)
    {
        fnCreatePosti();
        fnCreatePlatea();
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
            fnImpostaImg();
    }

    private void fnCreatePlatea()
    {
        string[] sFile = sPosti.Split('-');
        foreach (string s in sFile)
        {
            string[] sPoltrone = s.Split(';');
            foreach (string sp in sPoltrone)
            {
                if (sp != "")
                {
                    CheckBox cb = fnCreaPoltrona(sp);
                    PanelPlatea.Controls.Add(cb);
                    LiteralControl ltl = new LiteralControl("<div style=\"float:left;\">");
                    PanelPlatea.Controls.Add(ltl);
                    if (!cb.Enabled)
                    {
                        Image imgDisabilitato = new Image();
                        PanelPlatea.Controls.Add(imgDisabilitato);
                        imgDisabilitato.ImageUrl = sUrlPostoDisabilitato;
                        imgDisabilitato.ToolTip = "Posto non disponibile";
                        imgDisabilitato.AlternateText = "X";
                    }
                    else
                    {
                        Image imgLibero = new Image();
                        Image imgSelezionato = new Image();
                        PanelPlatea.Controls.Add(imgLibero);
                        PanelPlatea.Controls.Add(imgSelezionato);
                        imgLibero.ImageUrl = sUrlPostoLibero;
                        imgSelezionato.ImageUrl = sUrlPostoSelezionato;
                        imgSelezionato.ID = "is" + cb.ID;
                        imgLibero.ID = "il" + cb.ID;
                        string sTipoPosto = "Fila: " + sp.Split(':')[0] + " Posto: " + sp.Split(':')[1];
                        imgLibero.ToolTip = sTipoPosto;
                        imgLibero.AlternateText = sTipoPosto;
                        imgSelezionato.AlternateText = sTipoPosto;
                        imgSelezionato.ToolTip = sTipoPosto;
                        imgSelezionato.Style.Add("display", "none");
                        imgLibero.Attributes.Add("onclick", "fnSetCheck('"+imgLibero.ClientID.Replace(imgLibero.ID,"")+"','"+ cb.ID+"','true')");
                        imgSelezionato.Attributes.Add("onclick", "fnSetCheck('" + imgSelezionato.ClientID.Replace(imgSelezionato.ID,"") + "','" + cb.ID + "','false')");
                    }
                    LiteralControl ltl2 = new LiteralControl("</div>");
                    PanelPlatea.Controls.Add(ltl2);
                }
            }
            PanelPlatea.Controls.Add(new LiteralControl("<br style=\"clear:both;\"/>"));

        }
    }
    private void fnImpostaImg()
    {
        try
        {

            string[] sFile = sPosti.Split('-');
            foreach (string s in sFile)
            {
                string[] sPoltrone = s.Split(';');
                foreach (string sp in sPoltrone)
                {
                    if (sp != "")
                    {
                        Image imgs = new Image();
                        Image imgl = new Image();
                        string[] sDettaglioPoltrona = sp.Split(':');
                        try
                        {
                            CheckBox cb = (CheckBox)PanelPlatea.FindControl("f" + sDettaglioPoltrona[0] + "p" + sDettaglioPoltrona[1]);
                            if (cb != null)
                            {
                                if (cb.Enabled)
                                {
                                    imgs = (Image)PanelPlatea.FindControl("isf" + sDettaglioPoltrona[0] + "p" + sDettaglioPoltrona[1]);
                                    imgl = (Image)PanelPlatea.FindControl("ilf" + sDettaglioPoltrona[0] + "p" + sDettaglioPoltrona[1]);
                                    if (cb.Checked)
                                    {
                                        imgs.Style[HtmlTextWriterStyle.Display] = "block";
                                        imgl.Style[HtmlTextWriterStyle.Display] = "none";
                                    }
                                    else
                                    {
                                        imgs.Style[HtmlTextWriterStyle.Display] = "none";
                                        imgl.Style[HtmlTextWriterStyle.Display] = "block";
                                    }
                                }
                            }

                        }
                        catch (Exception)
                        {
                        }
                    }
                }
            }
        }
        catch (Exception) { }

    }

    private CheckBox fnCreaPoltrona(string sPoltrona)
    {
        CheckBox cb = new CheckBox();
        string[] sDettaglioPoltrona = sPoltrona.Split(':');
        cb.ID = "f" + sDettaglioPoltrona[0] + "p" + sDettaglioPoltrona[1];
        if (sDettaglioPoltrona[2] == "1")
            cb.Enabled = false;
        cb.Style.Add("display", "none");
        return cb;
    }

    private void fnCreatePosti()
    {
        int libera = 0;
        string sOccupati = "01,05,06,07,14";
        for (int f = 1; f < 10; f++)
        {
            for (int p = 1; p < 15; p++)
            {
                if (sOccupati.Contains(p.ToString("00")))
                    libera = 1;
                else
                    libera = 0;
                sPosti += f.ToString() + ":" + p.ToString("00") + ":" + libera.ToString() + ";";
            }
            sPosti += "-";
        }

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        string sRisultato = "";
        string[] sFile = sPosti.Split('-');
        foreach (string s in sFile)
        {
            string[] sPoltrone = s.Split(';');
            foreach (string sp in sPoltrone)
            {
                if (sp != "")
                {
                    string[] sDettaglioPoltrona = sp.Split(':');
                    try
                    {
                        CheckBox cb = (CheckBox)PanelPlatea.FindControl("f" + sDettaglioPoltrona[0] + "p" + sDettaglioPoltrona[1]);
                        if (cb != null)
                        {
                            if (cb.Checked)
                            {
                                if (sRisultato != "")
                                    sRisultato += "\\r\\n";
                                sRisultato += "Fila: " + sDettaglioPoltrona[0] + " Posto: " + sDettaglioPoltrona[1];
                            }
                        }

                    }
                    catch (Exception)
                    {
                    }
                }
            }
        }
        if (sRisultato == "")
            ClientScript.RegisterClientScriptBlock(this.GetType(), "ris", "alert('nessun posto selezionato')", true);
        else
        {
            sRisultato = "Posti selezionati:\\r\\n" + sRisultato;
            ClientScript.RegisterClientScriptBlock(this.GetType(), "ris", "alert('" + sRisultato + "')", true);
        }

    }
}

dovresti aver preparato le tre immagini che ti dicevo. le devi mettere dentro una cartella Images e si devono chiamare come vedi nel file cs all'inizio

string sUrlPostoDisabilitato = "~/Images/postoDisabilitato.gif";
string sUrlPostoLibero = "~/Images/postoLibero.gif";
string sUrlPostoSelezionato = "~/Images/postoSelezionato.gif";

oppure cambia il percorso e/o nome delle immagini.

Ciao Alessandro
29 messaggi dal 25 gennaio 2002
well grazie infinite davvero
e complimenti per la chiarezza
426 messaggi dal 17 aprile 2006
di nulla :)

ciao
Alessandro Di Cicco

Ciao Alessandro

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.