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. ![](http://www.imhoproject.org/files/allegro.gif)
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