Moduli dinamici nella pagina Oggi

Modificata il mercoledì, 30 settembre 2009 17:07 da stefano — Categorizzata come: Non Categorizzata

Oggi, la dashboard del sistema, può essere estesa con uteriori moduli a piacimento, che potranno essere integrabili con Tustena Stesso o con altri applicativi.

Per creare un nuovo modulo, per prima cosa bisogna aggiungere un file .ascx (il nome è indifferente) nella cartella today.

Questa pagina è solo un Draft, il contenuto può essere incompleto e contenere errori.

Allego un esempio di codebehind per semplificare le cose:

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.HtmlControls;
using Digita.Tustena.Base;
using Digita.Tustena.Core;
using Digita.Tustena.Database;
using Digita.Tustena.WebControls;


namespace Digita.Tustena.today
{

    public partial class MyTodayModule : GUserControl, IToday
    {
        public string ResourceText { get { return "moduletxt01"; } }
        public string ClientId { get { return "mymodule"; } }
        public bool EnablePaging { get { return true; } }

        public bool isEnable(string controls)
        {
            return controls.Contains(ClientId);
        }

        protected void Page_Load(object sender, EventArgs e)
        {
                if (!Page.IsPostBack)
                {
                    //Inizializza controllo
                }

        }

        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            MyModuleRepeater.ItemCommand += new RepeaterCommandEventHandler(MyModuleRepeater_ItemCommand);
            MyModuleRepeater.ItemDataBound += new RepeaterItemEventHandler(MyModuleRepeater_ItemDataBound);
            
        }

 void MyModuleRepeater_ItemCommand(object source, RepeaterCommandEventArgs e)
        {
            switch (e.CommandName)
            {
                case "DoSomething":
                       // Do Something
                   break;
            }
        }



        void MyModuleRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            switch (e.Item.ItemType)
            {                
                case ListItemType.Item:
                case ListItemType.AlternatingItem:
                    // Do Binding
                    break;
            }
        }
        protected override void OnLoad(EventArgs e)
        {   
            base.OnLoad(e);
        }

}

Una volta creato il file .cs, bisogna far ereditare la classe da IToday e implementare esplicitamente l'interfaccia come nell'esempio.


Completando le proprietà, il modulo sarà completo e caricato dinamicamente nella scheda.

Ci sono alcuni unteripri punti da tenere in considerazione. Come si vede nell'esempio, l'inizializzazione degli eventi nell'OnInit deve essere effettuata dopo il base.OnInit(e) e non prima, altrimenti il compilatore JIT di Tustena non riuscirà a compilare il codice.



Qui sotto un esempio funzionante per leggere un feed Rss (in questo caso il feed di Gazzetta.it). Dopo aver instanziato l'oggetto come IToday, andiamo, nel Page_Load a scaricare il feed rss (che è una struttura dati xml) e a popolare il controllo Repeater, nativo di ASP.Net con i dati che abbiamo scaricato.

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Gazzetta.ascx.cs" Inherits="today_Gazzetta" %>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
    <tr>
        <td align="left" class="pageTitle" valign="top">
            Gazzetta
        </td>
    </tr>
    <tr>
        <td>
            <asp:Repeater runat="server" ID="GazzettaFeed">
                <HeaderTemplate>
                    <table border="0" cellpadding="0" cellspacing="0" width="100%" class="TableHlip TodayBlackLine">
                        <tr>
                            <th class="GridTitle">
                                Titolo Notizia
                            </th>
                </HeaderTemplate>
                <ItemTemplate>
                    <tr class="GridItem">
                        <td>
                            <asp:Literal ID="GazzettaItem" runat="server"></asp:Literal>
                        </td>
                    </tr>
                </ItemTemplate>
                <AlternatingItemTemplate>
                    <tr class="GridItemAltern">
                        <td>
                            <asp:Literal ID="GazzettaItem" runat="server"></asp:Literal>
                        </td>
                    </tr>
                </AlternatingItemTemplate>
                <FooterTemplate>
                    </table>
                </FooterTemplate>
            </asp:Repeater>
        </td>
    </tr>
</table>

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Digita.Tustena.Base;
using System.Net;
using System.Xml;
using System.IO;

public partial class today_Gazzetta : GUserControl, IToday
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            WebClient wc = new WebClient();
            byte[] data = wc.DownloadData("http://www.gazzetta.it/rss/Calcio.xml");
            MemoryStream ms = new MemoryStream(data);
            XmlDocument xmldoc = new XmlDocument();
            xmldoc.Load(ms);
            GazzettaFeed.DataSource = xmldoc.SelectNodes("/rss/channel/item[position()<6]");
            GazzettaFeed.DataBind();
            
        }
    }

    protected override void OnInit(EventArgs e)
    {
        
        base.OnInit(e);
        GazzettaFeed.ItemDataBound += new RepeaterItemEventHandler(GazzettaFeed_ItemDataBound);
    }

    void GazzettaFeed_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {

        switch (e.Item.ItemType)
        { 
            case ListItemType.AlternatingItem:
            case ListItemType.Item:
                Literal GazzettaItem = (Literal)e.Item.FindControl("GazzettaItem");
                XmlNode xmln = (XmlNode)e.Item.DataItem;
                GazzettaItem.Text = string.Format("<a target=\"_blank\" href=\"{0}\">{1}</a>", xmln.SelectSingleNode("link").InnerText, xmln.SelectSingleNode("title").InnerText);

                break;
        }
    }

    

    #region IToday Membri di

    public string ClientId
    {
        get { return "GazzettaFeed"; }
    }

    public bool EnablePaging
    {
        get { return false; }
    }

    public string ResourceText
    {
        get { return "Gazzetta"; }
    }

    public bool isEnable(string controls)
    {
        return true;
    }

    #endregion
}