L'arte di lavorare con le WebPart - #6

Ringrazio coloro che hanno risposto gentilmente al mio Poll(icino), quindi, augurandovi un ottimo 2007 (in fondo siamo ancora all'8 gennaio), proseguo con la miniserie in oggetto.

 

Vi occorre mettere in comunicazione una webpart che contiene una tabella e passare il contenuto ad altre webparts che consumano la prima?

Bene, tutto quello che dovete fare è utilizzare l'interfaccia IWebPartTable; essa, sfruttando il meccanismo di connessione del Web Part Framework, consente con un metodo - GetTableData(TableCallback tbc) - e con una property - Schema - di spedire un DataTable verso una o più webparts

public sealed class WebPartProvider : WebPart, IWebPartTable
{
    DataTable _table;

    
public WebPartProvider()
    {
        
// codice che crea un DataTable (table), alcune DataColumn
        // e un pò di DataRow
    
}

    
public PropertyDescriptorCollection tableSchema
    {
        
get
        
{
            
return TypeDescriptor.GetProperties(table.DefaultView[0]);
        }
    }

    
public void GetTableData(TableCallback tableCallback)
    {
            tableCallback(table.Rows);
    }

    
public bool ConnPointON
    {
        
get
        
{
            
object o = ViewState["ConnPointON"];
            
return (o != null) ? (bool)o : true;
        }
        
set
        
{
            ViewState["ConnPointON"] = 
value;
        }
    }

    [ConnectionProvider("Table", 
typeof(TableProviderConnectionPoint), AllowsMultipleConnections = true)]
    
public IWebPartTable GetConnectionInterface()
    {
        
return new TableProviderWebPart();
    }
    

    
public class TableProviderConnPoint : ProviderConnectionPoint
    {
        
public TableProviderConnPoint(....) : base(....)
        {
        }

        
public override bool GetEnabled(Control control)
        {
            
return ((TableProviderWebPart)control).ConnectionPointEnabled;
        }
    }
}

Notate la firma di questo metodo public void GetTableData(TableCallback tableCallback); TableCallBack è delegato a contenere l'indirizzo del metodo che riceverà i dati (per brevità ho omesso alcuni controlli nel codice nonchè firme di metodi) mentre la property Schema contiene lo schema, appunto, dei dati da spedire e ricevere.

Ecco la seconda parte, la webpart consumer invoca il GetTableData e, nel RenderContents ne renderizza il contenuto mediante la property Schema.

public class WebPartConsumer : WebPart
{
    
private IWebPartTable provider;
    
private ICollection _tableData;
    
    
private void GetTableData(object tableData)
    {
      _tableData = (ICollection)tableData;
    }
    
    
protected override void OnPreRender(EventArgs e)
    {      
        provider.GetTableData(
new TableCallback(GetTableData));      
    }
    
    
protected override void RenderContents(HtmlTextWriter writer)
    {      
        PropertyDescriptorCollection props = _provider.Schema;
        
int count = 0;
        
if (props != null && props.Count > 0 && _tableData != null)
        {
          
foreach (PropertyDescriptor prop in props)
          {
            
foreach (DataRow o in _tableData)
            {
              writer.Write(prop.DisplayName + ": " + o[count]);
            }
           
            count = count + 1;
          }
        }              
    }
    
    [ConnectionConsumer("Table")]
    
public void SetConnectionInterface(IWebPartTable provider)
    {
      _provider = provider;
    }
    
    
public class TableConsumerConnPoint : ConsumerConnectionPoint
    {
      
public TableConsumerConnPoint(....)
        : 
base(....)
      {
      }    
    } 
}

powered by IMHO 1.3

posted @ lunedì 8 gennaio 2007 03:40

Print
Comments have been closed on this topic.
«aprile»
domlunmarmergiovensab
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011