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