30 messaggi dal 30 maggio 2008
Salve a tutti.

Mi sono imbattuto in un progetto web scritto in C#.

Il mio obiettivo è quello di creare un web custom control che renderizzi una Table(o la nasconda) alla pressione di un bottone.

Ho creato un file .js in cui ho scritto questa funzione:

function HideShow(id)
{
var row = document.getElementById(id);
if(row.style.display=='none')
{
row.style.display='block';
}
else
{
row.style.display='none';
}
}


Ho poi inseriro nell' OnPreRender della pagina la riga che verrà nascosta/mostrata alla pressione del bottone:

private TableRow _expandProcessListRow;

protected override void OnPreRender(EventArgs e)
{
//...
this._expandProcessListRow = new TableRow();
this._expandProcessListRow.ID = "_processListRowID";
this._expandProcessListRow.Style.Add(HtmlTextWriterStyle.Display, "none");

// Nell'OnPreRender viene poi chiamato il metodo che mostra la tabella:
CreateTable();
}

Eccolo qui (in modo semplificato):

private Table CreateTable()
{
Table GroupedTable = new Table();
GroupedTable.BorderWidth = Unit.Pixel(0);
GroupedTable.CellPadding = 0;
GroupedTable.CellSpacing = 0;
GroupedTable.Style.Add(HtmlTextWriterStyle.Width, "100%");

TableRow HeaderRow = new TableRow();
TableCell HeaderCell = new TableCell();

//Questo è il bottone che scatenerà l'evento
ImageButton bottone = new ImageButton();
bottone.ImageUrl = this.Page.ClientScript.GetWebResourceUrl(this.GetType(), "Resources.Images.Expand.gif");
bottone .Attributes.Add("onclick", "javascript:HideShow('" + this._expandProcessListRow.ID + "');");

HeaderCell.Controls.Add(this._imageButton)
HeaderRow.Cells.Add(HeaderCell);
GroupedTable.Rows.Add(HeaderRow);

// Aggiungo un testo alla riga da mostrare/nascondere
TableCell processListCell = new TableCell();
processListCell.Text = "PROVA";
this._expandProcessListRow.Cells.Add(processListCell);

worklistItemGroupedTable.Rows.Add(this._expandProcessListRow);
}


Non mi funziona...commetto qualche errore?
Grazie
3.165 messaggi dal 06 settembre 2002
Contributi | Blog
Ciao,

non ti funziona è un pò generico come errore  .

non ti invia lo script alla pagina?, ti da errore javascript? ti da errore lato server?

HTH

Nothing can be born from hartred

Stefano (SM15455) Mostarda
http://blogs.aspitalia.com/SM15455
Rome Italy
30 messaggi dal 30 maggio 2008
sm15455 ha scritto:
Ciao,

non ti funziona è un pò generico come errore  .

non ti invia lo script alla pagina?, ti da errore javascript? ti da errore lato server?

HTH


Ciao!
Allora...il problema è che non fa nulla!

Nella funzione ci entra, anche perchè ho rpovato a mettere un alert che viene sollevato.

A mio avviso il problema è dato dal fatto che l'id che passo alla funzione dovrebbe essere il ClientID.
Tale clientID, però, (proprietà del controllo) non viene mai valorizzato (ed è sempre null) e qudini il js non riesce a capire su COSA effettuare l'hide/show.

Come faccio a valorizzare ed a passargli il ClientID?
prova a usare la proprietà ClienID solo dopo che hai aggiunto i controlli nel loro contenitore

ciao marco

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

http://nostromo.spaces.live.com/default.aspx
43 messaggi dal 03 luglio 2006
Ciao, con qualche piccola revisione funziona.

Ti riporto qui sotto quello che ho testato:

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script type="text/javascript" language="javascript">
    function HideShow(id)
    {      
        var row = document.getElementById(id);
        if(row.style.display=='none')
        {
            row.style.display='block';
        }
        else
        {
            row.style.display='none';
        }
    } 
</script>

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    private TableRow _expandProcessListRow;

    protected override void OnPreRender(EventArgs e)
    {
        //...
        this._expandProcessListRow = new TableRow();
        this._expandProcessListRow.ID = "_processListRowID";
        this._expandProcessListRow.Style.Add(HtmlTextWriterStyle.Display, "none");

        // Nell'OnPreRender viene poi chiamato il metodo che mostra la tabella:
        this.Controls.Add(this.CreateTable()); // <-- Aggiunge la tabella nella pagina

    }

    //Eccolo qui (in modo semplificato):

    private Table CreateTable()
    {
        Table GroupedTable = new Table();
        GroupedTable.BorderWidth = Unit.Pixel(0);
        GroupedTable.CellPadding = 0;
        GroupedTable.CellSpacing = 0;
        GroupedTable.Style.Add(HtmlTextWriterStyle.Width, "100%");

        TableRow HeaderRow = new TableRow();
        TableCell HeaderCell = new TableCell();

        //Questo è il bottone che scatenerà l'evento
        ImageButton bottone = new ImageButton();
        bottone.ImageUrl = this.Page.ClientScript.GetWebResourceUrl(this.GetType(), "Resources.Images.Expand.gif");
        bottone.Attributes.Add("onclick", "javascript:HideShow('" + this._expandProcessListRow.ID + "');");

        HeaderCell.Controls.Add(bottone);
        HeaderRow.Cells.Add(HeaderCell);
        GroupedTable.Rows.Add(HeaderRow);

        // Aggiungo un testo alla riga da mostrare/nascondere
        TableCell processListCell = new TableCell();
        processListCell.Text = "PROVA";
        this._expandProcessListRow.Cells.Add(processListCell);

        GroupedTable.Rows.Add(this._expandProcessListRow);

        return GroupedTable; // <-- il risultato della funzione 
    }

    public override void VerifyRenderingInServerForm(Control control)
    {
        // Lasciare vuoto
    } 
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Pagina senza titolo</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
    </div>
    </form>
</body>
</html>


Sem Tamburella
43 messaggi dal 03 luglio 2006
 nel codice del precedente post mi sono accorto che la tabella renderizzava fuori dal form runat="server", ho rimediato con un PlaceHolder

Sistemato il form, il click sul controllo ImageButton fa partire un postback che fa ricaricare da capo la pagina dal server annullando quello che fa la funzione javascript HideShow. Ho rimediato sostituendo l'ImageButton con HtmlImage evitando il postback.


Questo è codice corretto

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script type="text/javascript" language="javascript">
    function HideShow(id)
    {              
        var row = document.getElementById(id);
        
        if(row.style.display=="none")
        {
            row.style.display="block";
        }
        else
        {
            row.style.display="none";
        }        
        
    } 
</script>

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    private TableRow _expandProcessListRow;

    protected override void OnPreRender(EventArgs e)
    {
        //...
        this._expandProcessListRow = new TableRow();
        this._expandProcessListRow.ID = "_processListRowID";
        this._expandProcessListRow.Style.Add(HtmlTextWriterStyle.Display, "none");

        // Nell'OnPreRender viene poi chiamato il metodo che mostra la tabella:
        this.PlaceHolder1.Controls.Add(this.CreateTable()); // <-- Aggiunge la tabella nella pagina
    }

    //Eccolo qui (in modo semplificato):

    private Table CreateTable()
    {
        Table GroupedTable = new Table();
        GroupedTable.BorderWidth = Unit.Pixel(0);
        GroupedTable.CellPadding = 0;
        GroupedTable.CellSpacing = 0;
        GroupedTable.Style.Add(HtmlTextWriterStyle.Width, "100%");

        TableRow HeaderRow = new TableRow();
        TableCell HeaderCell = new TableCell();

        //Questo è il bottone che scatenerà l'evento
        HtmlImage bottone = new HtmlImage();
        bottone.Src = this.Page.ClientScript.GetWebResourceUrl(this.GetType(), "Resources.Images.Expand.gif");
        //bottone.OnClientClick = "HideShow('" + this._expandProcessListRow.ID + "')";
        bottone.Attributes.Add("OnClick", "HideShow('" + this._expandProcessListRow.ID + "')");

        HeaderCell.Controls.Add(bottone);
        HeaderRow.Cells.Add(HeaderCell);
        GroupedTable.Rows.Add(HeaderRow);

        // Aggiungo un testo alla riga da mostrare/nascondere
        TableCell processListCell = new TableCell();
        processListCell.Text = "PROVA";
        this._expandProcessListRow.Cells.Add(processListCell);

        GroupedTable.Rows.Add(this._expandProcessListRow);

        return GroupedTable; // <-- il risultato della funzione 
    }

    public override void VerifyRenderingInServerForm(Control control)
    {
        // Lasciare vuoto
    } 
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Pagina senza titolo</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
        </div>        
    </form>
</body>
</html>


Sem Tamburella

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.