33 messaggi dal 08 gennaio 2014
Ciao, ho 3 elementi: calendar, un Panel e un ModalPopupExtender. (il tutto usando una masterpage)
Il mio problema è valorizzare i controls contenuti dentro il Panel attraverso la funzione LoadPopUpCalendario:

Provero' a spiegarmi meglio:
Grazie al Calendar1_DayRender(object sender, DayRenderEventArgs e)
creo un linkbutton per ogni prenotazione che ho per quel giorno. Il linkbutton richiama funzione javascript che apre il Panel attraverso il ModalPopupExtender:

-aspx:
<script language="javascript">
function popupModal(value) {
$get('<%=hdnOidPrenotazione.ClientID %>').innerText = value;
$find('programmaticModalPopupBehavior').show();
PageMethods.LoadPopUpCalendario(value);
}
</script>




<asp:Calendar ID="Calendar1" runat="server" BackColor="White" BorderColor="#3366FF" BorderStyle="Solid" CellSpacing="1"
Font-Names="Verdana" Font-Size="9pt" ForeColor="Black" Height="600px" NextPrevFormat="FullMonth" Width="900px" ShowNextPrevMonth="true"
OnDayRender="Calendar1_DayRender" OnSelectionChanged="Calendar1_SelectionChanged" TitleStyle-BackColor="#66FF66" BorderWidth="0" CellPadding="1"
>
<DayHeaderStyle Font-Bold="True" Font-Size="12pt" ForeColor="#6699ff" Height="8pt" HorizontalAlign="Center" BorderStyle="Solid" BorderColor="#999999" BorderWidth="1px" />
<DayStyle BackColor="WhiteSmoke" BorderWidth="0" HorizontalAlign="Left" VerticalAlign="Top" BorderStyle="Solid" BorderColor="White" Width="160px" Height="150px" />
<NextPrevStyle Font-Bold="True" Font-Size="8pt" ForeColor="White" />
<OtherMonthDayStyle ForeColor="#999999" />
<SelectedDayStyle BackColor="#333399" ForeColor="White" />
<TitleStyle BackColor="#6699FF" BorderStyle="Solid" Font-Bold="True" Font-Size="12pt" ForeColor="White" Height="12pt" BorderColor="#6699FF" BorderWidth="1px" />
<TodayDayStyle BackColor="#999999" ForeColor="White" />
</asp:Calendar>






<asp:Panel ID="PanelDettaglioPrenotazione" runat="server" Width="470px" ScrollBars="Vertical" Height="520px" BackColor="#6699FF" BorderStyle="Groove">
<table style="width: 450px; height: 220px;">
<tr>
<td class="titoletto" style="color:white; width:400px">DETTAGLIO PRENOTAZIONE <asp:HiddenField ID="hdnOidPrenotazione" runat="server" /></td>
<td style="text-align:right;vertical-align:text-top">
<asp:ImageButton ID="btmClosePanelDettaglioPrenotazione" runat="server" ImageUrl="~/Images/img/close_button.gif" OnClick="btmClosePanelDettaglioPrenotazione_Click" />
</td>
</tr>
<tr style="text-align:left; font-size: large; color: #E7E7FF; height: 30px">
<td style="width: 200px;">Sala</td>
<td><asp:Label ID="lblSaladettaglio" runat="server" Text="" ClientIDMode="Static"></asp:Label></td>
<tr style="text-align:left; font-size: large; color: #E7E7FF; height: 30px">
<td style="width: 200px;" colspan="2">
<asp:Button ID="btmModificaDettaglio" runat="server" Text="Button" />
</td>
</tr>

</table>
</asp:Panel>




<asp:Button runat="server"
ID="HiddenTargetControlForModalPopup"
style="display:none"/>

<ajaxToolkit:ModalPopupExtender ID="ModalPopupExtenderDettaglioPrenotazione" runat="server" BehaviorID="programmaticModalPopupBehavior"
TargetControlID="HiddenTargetControlForModalPopup" PopupControlID="PanelDettaglioPrenotazione" DropShadow="true"
OnOkScript="InviaBtmClient()">
<Animations>
<OnShowing>
<FadeIn Duration=".5" Fps="30" />
</OnShowing>
<OnShown>
<FadeIn Duration=".5" Fps="30" />
</OnShown>
<%-- neither animation works from code-behind --%>
<OnHiding>
<FadeOut Duration=".5" Fps="30" />
</OnHiding>
<OnHidden>
<FadeOut Duration=".5" Fps="30" />
</OnHidden>
</Animations>
</ajaxToolkit:ModalPopupExtender>




-cs:
Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
. . .
e.Cell.Controls.Add(new LiteralControl("<div class='agenda'>"));
while (reader.Read())
{
. . .
oidPrenotazione = reader["oid"].ToString();
nomeSala = reader["nomesala"].ToString();
oraDa = reader["oradaabbreviato"].ToString();
OraA = reader["oraaabbreviato"].ToString();


LinkButton lnkDettaglio = new LinkButton();
lnkDettaglio.ID = "lnkPrenotazione";
lnkDettaglio.Text = "-" + nomeSala + " " + oraDa + " " + OraA;
lnkDettaglio.CssClass = "imgMouseOver";
lnkDettaglio.Attributes["onclick"] = "popupModal('" + oidPrenotazione + "');";

e.Cell.Controls.Add(lnkDettaglio);
e.Cell.Controls.Add(new LiteralControl("<br><br>"));
e.Cell.Controls.Add(new LiteralControl("</div>"));
}
}






//METODO RICHIAMATO DALLA FUNZIONE JAVASCRIPT:
[System.Web.Services.WebMethod]
public static void LoadPopUpCalendario(string oidPrenotazDettaglio)
{
prenotazioneSala af = new prenotazioneSala();
af.popUpLoadCompila(oidPrenotazDettaglio);


}

Dal metodo in questione (LoadPopUpCalendario) vorrei poter accedere ai controlli del Panel&#8230;

Es: lblSaladettaglio.text="valore";
Come posso fare?




Un grazie a priori.
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

shozocsharp ha scritto:

vorrei poter accedere ai controlli del Panel

non puoi perché il metodo LoadPopUpCalendario è statico: vuol dire che durante la sua esecuzione non esisterà alcuna istanza della tua pagina, e quindi neanche alcun controllo con cui poter interagire.

Una soluzione potrebbe essere quella di sostituire il tuo Panel con un UpdatePanel, che ti consentirebbe di aggiornare i controlli come hai chiesto tu.

Tuttavia, non ti voglio far stravolgere la pagina. Secondo me riesci a risolvere anche mantenendo il tuo webmethod LoadPopUpCalendario.
Dovrai semplicemente impostare i valori dei campi lato client, anziché lato server.
Devi solo fare in modo che LoadPopUpCalendario restituisca un oggetto, anziché void. Questo oggetto arriverà lato client e con del codice javascript dovrai leggere i valori dalle sue proprietà ed impostarli sui controlli che intendi aggiornare.

Ecco come farsi restituire dei dati dal page method.
http://www.asp.net/ajaxlibrary/jquery_webforms_retrieve_data_from_pagemethod.ashx

ciao,
Moreno
Modificato da BrightSoul il 26 giugno 2014 21.06 -

Enjoy learning and just keep making
33 messaggi dal 08 gennaio 2014
Ciao BrightSoul grazie per l'aiuto. Vorrei poter seguire il tuo primo consiglio, perché mi sembra più pulito, cioè usare l'updatePanel. Ho visto questo esempio: http://stackoverflow.com/questions/19807988/adding-triggers-dynamically-on-updatepanel-for-dynamially-added-controls
ma a me non funziona, il "_Default_Click" non esiste nel contesto corrente&#8230;
Come posso sbloccarmi da questa situazione?


Grazie ancora
Modificato da shozocsharp il 30 giugno 2014 10.39 -
Modificato da shozocsharp il 30 giugno 2014 10.40 -
33 messaggi dal 08 gennaio 2014
Ciao BrightSoul, mi potresti dire cosa fare con UpdatePanel in questo contesto? Il link che ho inserito nel post precedente e' inerente o sono fuori strada?

Please, rispondimi perche' non so proprio come andare avanti. :-(

Grazie Shozo
Modificato da shozocsharp il 01 luglio 2014 17.09 -
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

shozocsharp ha scritto:

Il link che ho inserito nel post precedente e' inerente o sono fuori strada?

No, non credo ti sia utile perché - da quanto ho capito - non hai bisogno di aggiungere dei controlli dinamicamente.
Dovresti iniziare con un articolo che ti spieghi come inziare a lavorare con l'UpdatePanel. Crea un nuovo progetto e poi prova a mettere in pratica il codice che trovi in questo articolo di Marco Leoncini. Ti servirà come esercizio.
http://www.aspitalia.com/script/860/Controlli-UpdatePanel-UpdateProgress-ASP.NET-AJAX-1.0.aspx
Poi, continua provando gli altri esempi che trovi qui:
http://msdn.microsoft.com/en-US/library/bb399001.aspx

Solo dopo averne compreso il funzionamento e valutato che faccia al caso tuo, procedi con l'integrazione nella tua pagina. Ma prima fanne una copia, nel caso tu voglia tornare alla versione attuale ed usare invece l'altra soluzione che ti avevo consigliato.

ciao,
Moreno
Modificato da BrightSoul il 01 luglio 2014 20.31 -

Enjoy learning and just keep making
33 messaggi dal 08 gennaio 2014
Io aggiungo un controllo dinamicamente: lnkDettaglio.ID = "lnkPrenotazione";
Per questo ti chiedevo se era il caso di seguire l'esempio che avevo postato.

while (reader.Read())
{
. . .
oidPrenotazione = reader["oid"].ToString();
nomeSala = reader["nomesala"].ToString();
oraDa = reader["oradaabbreviato"].ToString();
OraA = reader["oraaabbreviato"].ToString();


LinkButton lnkDettaglio = new LinkButton();
lnkDettaglio.ID = "lnkPrenotazione";
lnkDettaglio.Text = "-" + nomeSala + " " + oraDa + " " + OraA;
lnkDettaglio.CssClass = "imgMouseOver";
lnkDettaglio.Attributes["onclick"] = "popupModal('" + oidPrenotazione + "');";

e.Cell.Controls.Add(lnkDettaglio);
e.Cell.Controls.Add(new LiteralControl("<br><br>"));
e.Cell.Controls.Add(new LiteralControl("</div>"));
}


Seguiro' comunque i tuoi consigli e anzi continuo a ringraziarti.
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

shozocsharp ha scritto:

Per questo ti chiedevo se era il caso di seguire l'esempio che avevo postato.

Hai ragione, mi aveva confuso il fatto che ora quei LinkButton stanno semplicemente aprendo una popup, mentre dovrebbero essere registrati come trigger, altrimenti non riusciranno a scatenare l'aggiornamento dell'UpdatePanel che si trova nella popup stessa.

Se ho compreso bene la questione, sì, quell'articolo potrebbe aiutarti.
Hai fatto progressi nel frattempo?

shozocsharp ha scritto:

ma a me non funziona, il "_Default_Click" non esiste nel contesto corrente&#8230;

Sì, perché devi anche creare una funzione chiamata in quel modo nel code file. Esempio:

protected void _Default_Click(object sender, EventArgs e){
   //qui codice per aggiornare i controlli contenuti nell'UpdatePanel
}


ciao,
Moreno
Modificato da BrightSoul il 02 luglio 2014 20.42 -

Enjoy learning and just keep making
33 messaggi dal 08 gennaio 2014
Ho trovato una soluzione! anche se sicuramente non elegante anche perché esegue il postback pur essendoci un UpdatePanel.

aspx:

<script language="javascript">
function popupModal(id) {
var myHidden = document.getElementById('<%= hdnIdPrenotazioneOperazione.ClientID %>');
if (myHidden)
{
myHidden.value = id;
}
}
</script>

<asp:HiddenField ID="hdnIdPrenotazioneOperazione" runat="server" />


<asp:Calendar ID="Calendar1" runat="server" OnDayRender="Calendar1_DayRender" OnSelectionChanged="Calendar1_SelectionChanged"
. . . . . . . . .
</asp:Calendar>
</td>
</tr>
</table>








<asp:UpdatePanel ID="UpdatePanelDettaglioPrenotazione" runat="server" Width="470px" ScrollBars="Vertical" Height="520px" BackColor="#6699FF" BorderStyle="Groove">
<ContentTemplate>
<table style="width: 470px; height: 220px; background-color:#6699FF;" border="1">
<tr>
<td class="titoletto" style="color: white; width: 460px; text-align:center " colspan="2">DETTAGLIO PRENOTAZIONE</td>
<td style="text-align: right; vertical-align: text-top; width:10px">
<asp:ImageButton ID="btmClosePanelDettaglioPrenotazione" runat="server" ImageUrl="~/Images/img/close_button.gif" OnClick="btmClosePanelDettaglioPrenotazione_Click" />
</td>
</tr>

<tr style="text-align: left; font-size: large; color: #E7E7FF; height: 30px">
<td style="width: 470px; text-align:center" colspan="3">
<asp:Button ID="btmModificaDettaglio" runat="server" Text="Button" OnClick="btmModificaDettaglio_Click" />
</td>
</tr>
</table>
</ContentTemplate>
</asp:UpdatePanel>




<asp:Button ID="HiddenTargetControlForModalPopup" runat="server" OnClick="HiddenTargetControlForModalPopup_Click" Style="display: none" />




<ajaxToolkit:ModalPopupExtender ID="ModalPopupExtenderDettaglioPrenotazione" runat="server"
TargetControlID="HiddenTargetControlForModalPopup" PopupControlID="UpdatePanelDettaglioPrenotazione" DropShadow="true">
</ajaxToolkit:ModalPopupExtender>


______________________________________________________________________


.CS:


protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
. . .
}
else
{
//ON CLICK SULLA PRENOTAZIONE ESEGUE IL POSTBACK E PORTA QUI.
string prenotazioneIdOPeraz = hdnIdPrenotazioneOperazione.Value.ToString();


if (IsInteger(prenotazioneIdOPeraz))
{
ModalPopupExtenderDettaglioPrenotazione.Show();
txtSaladettaglio.Text = "shozo bella li";
}
else
{
ModalPopupExtenderDettaglioPrenotazione.Hide();
}
}
}

bool IsInteger(string text)
{
try
{
int i = Convert.ToInt32(text);
return true;
}
catch
{
return false;
}
}


protected void Calendar1_SelectionChanged(object sender, EventArgs e)
{
string giornoSele = Calendar1.SelectedDate.ToString();
hdnIdPrenotazioneOperazione.Value = "giornoModified";
ModalPopupExtenderDettaglioPrenotazione.Hide();
//RESPONSE.REDIRECT A PAGINA ELENCO APPUNTAMENTI.
}

protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
string dataCalendario = e.Day.Date.ToString();
dataCalendario = String.Format("{0:dd/MM/yyyy}", dataCalendario);

dataCalendario = Conversionedata(dataCalendario);

. . . . . . . . . . . . . .



string oidPrenotazione = "";
string nomeSala = "";
string oraDa = "";
string OraA = "";
try
{
. . . . . . .

e.Cell.Controls.Add(new LiteralControl("<div class='agenda'>"));


LinkButton[] lnkDettaglio = new LinkButton[reader.FieldCount];

Int32 iCiclo = 0;
while (reader.Read())
{
iCiclo++;
if (reader.IsDBNull(0))
{
oidPrenotazione = "";
nomeSala = "";
oraDa = "";
OraA = "";
}
else
{
oidPrenotazione = reader["oid"].ToString();
nomeSala = reader["nomesala"].ToString();
oraDa = reader["oradaabbreviato"].ToString();
OraA = reader["oraaabbreviato"].ToString();



lnkDettaglio[iCiclo] = new LinkButton();
lnkDettaglio[iCiclo].ID = "lnkPrenotazione" + iCiclo;
lnkDettaglio[iCiclo].Click += new EventHandler(DynamicClick);
ModalPopupExtenderDettaglioPrenotazione.TargetControlID = lnkDettaglio[iCiclo].ID;


lnkDettaglio[iCiclo].Attributes["onclick"] = "popupModal('" + oidPrenotazione + "');";
//lnkDettaglio[iCiclo].Attributes.Add("OnClick", "DynamicClick();");
lnkDettaglio[iCiclo].Attributes.Add("href", "javascript:__doPostBack('DynamicClick','')");



lnkDettaglio[iCiclo].Text = "-" + nomeSala + " " + oraDa + " " + OraA;
lnkDettaglio[iCiclo].BorderColor = System.Drawing.Color.LightGray;
lnkDettaglio[iCiclo].BorderStyle = BorderStyle.Solid;
lnkDettaglio[iCiclo].BorderWidth = 2;
lnkDettaglio[iCiclo].Width = 135;
lnkDettaglio[iCiclo].CssClass = "imgMouseOver";



AsyncPostBackTrigger trigger = new AsyncPostBackTrigger();
trigger.ControlID = lnkDettaglio[iCiclo].UniqueID;
trigger.ControlID = lnkDettaglio[iCiclo].ID;
trigger.EventName = "Click";
UpdatePanelDettaglioPrenotazione.Triggers.Add(trigger);


e.Cell.Controls.Add(lnkDettaglio[iCiclo]);
e.Cell.Controls.Add(new LiteralControl("<br><br>"));
}
}
e.Cell.Controls.Add(new LiteralControl("</div>"));

}
catch (Exception ex)
{

}


e.Cell.BorderStyle = BorderStyle.Double;
e.Cell.BorderColor = System.Drawing.Color.Red;


}



C' e' un modo senza eseguire il PostBack?

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.