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.
«dicembre»
domlunmarmergiovensab
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234