日期:2014-05-18  浏览次数:20578 次

Repeater嵌套问题,正解后解贴
Repeater1嵌套Repeater2中,想获取Repeater2中的表[source]的cid字段值.是想根据这个值来获取用户点了Repeater2中的哪条记录,然后让它的点击次数加一,现在就是不知道怎么获取Repeater2中的表[source]的cid字段值?请高手支招,先谢了!
private   void   Repeater1_ItemDataBound(object   sender,   RepeaterItemEventArgs   e)
{
object   cid;
             //这里是获取Repeater1中的cid的值.
cid   =   DataBinder.Eval(e.Item.DataItem, "cid ");
Repeater   Repeater2;
Repeater2   =   (Repeater)   e.Item.FindControl( "Repeater2 ");
string   sqlnews   =   "select   top   6   *   from   [source]   where   BigClassID= ' "+cid.ToString()+ " '   and   cflag=1   order   by   cindex ";
DataSet   ds1   =   conn.GetDataSet(sqlnews, "source ");
Repeater2.DataSource   =   ds1.Tables[ "source "].DefaultView;
Repeater2.DataBind();

}

------解决方案--------------------
1.
提供一个比较精简的方法, 直接设置 click 事件处理程序,
包括不嵌套情况, 以及 DataGrid GridView DataList 均可以使用次方法

2.
特别适合嵌套数据控件

3.
如果多个 button, 还是使用数据控件的 ItemCommand 方式比较合适


<%@ Page Language= "C# " %>
<%@ Import Namespace= "System.Data " %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN " "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">

<script runat= "server ">

void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) {
// 首次加载数据一定要放在 !IsPostBack 内,
// 避免回发的时候再次绑定数据,覆盖复选框状态
LoadProductData();
}
}

void lnkPro_Click(object sender, EventArgs e)
{
// 触发事件的 Button
LinkButton btn = sender as LinkButton;
// Button 所在行
RepeaterItem item = btn.NamingContainer as RepeaterItem;
Response.Write( "Selected ProductID: " + btn.CommandArgument);
Response.Write( " <br/> ");
Response.Write( "Selected RepeaterItemIndex: " + item.ItemIndex);
}

/// <summary>
/// Repeater 的每一项执行数据绑定之后调用事件处理程序,
/// 在程序内部实现绑定嵌套的 Repeater
/// </summary>
/// <param name= "sender "> </param>
/// <param name= "e "> </param>
void rptProCat_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
// e.Item.DataItem 公开绑定到 DataList 当前项的数据,
// 这里为 包含 Category 数据的 DataRowView 对象, 因为我们提供的数据源为 DataTable
DataRowView drv = e.Item.DataItem as DataRowView;
if(drv == null) return;

// 查找嵌套的 DataList
Repeater rptPro = e.Item.FindControl( "rptPro ") as Repeater;
if (rptPro == null) return;

// 我们已经将与Category相关Product全部加载到DataSet中,
// 并建立了 DataRelation,因此这里直接反向获取 Product DataTable,
// 并使用 DataView 过滤目标数据
DataRow dr = drv.Row;
DataView dvPro = dr.Table.ChildRelations[ "ProCatShip "].ChildTable.DefaultView;
dvPro.RowFilter = "CategoryId = " + dr[ "CategoryID "].ToString();

rptPro.DataSource = dvPro;
rptPro.DataBind();
}

void LoadProductData()
{
DataSet ds = CreateProductCategoryDataSet();
rptProCat.Dat