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