This one was originally asked on Forums. You can provide a user control into ItemTemplate property of DataList in code, and use it as a reusable template while the uc still participates in databinding, accerssing the data source. Here is a sample:
ucTemplatesample.aspx
=====================
<asp:DataList ID="DataList1" runat="server">
</asp:DataList>
ucTemplatesample.aspx.aspx.cs
=============================
...
protected void Page_Load(object sender, EventArgs e)
{
DataList1.ItemTemplate = Page.LoadTemplate("ucTemplate.ascx");
if(!IsPostBack)
BindData();
}
private void BindData()
{
DataTable dt = new DataTable();
dt.Columns.Add("something", typeof(String));
DataRow dr = null;
dr = dt.NewRow();
dr["something"] = "text1";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["something"] = "text2";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["something"] = "text3";
dt.Rows.Add(dr);
DataList1.DataSource = dt;
DataList1.DataBind();
}
...
ucTemplate.ascx
===============
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ucTemplate.ascx.cs" Inherits="ucTemplate" %>
<asp:TextBox ID="TextBoxinUC" runat="server" />
ucTemplate.ascx.cs
==================
...
protected override void OnDataBinding(EventArgs e)
{
base.OnDataBinding(e);
//here is more generic version, knows very little about the data source
object obj = DataBinder.GetPropertyValue(this.NamingContainer, "DataItem");
TextBoxinUC.Text = DataBinder.Eval(obj,"something").ToString();
//Following assumes that the containing control's item type is known at compile time
//You need it in case you need to access DataKeys etc
//DataListItem cont = this.NamingContainer as DataListItem;
//if (cont != null)
//{
// //If you don't want to know about the data source you can use this
// //TextBoxinUC.Text = (string)DataBinder.Eval(cont.DataItem, "something");
// //Typed way, tie yo to a dataTable/dataView as data source
// DataRowView drw = cont.DataItem as DataRowView;
// if (drw != null)
// TextBoxinUC.Text = drw["something"].ToString();
//}
}
...