C# 模板中的服务器控件如何对数据上下文敏感?

C# 模板中的服务器控件如何对数据上下文敏感?,c#,.net,asp.net,data-binding,templates,C#,.net,Asp.net,Data Binding,Templates,假设控件X有一个名为RowTemplate的模板 因此,X的标记类似于: <foo:X> <RowTemplate> <foo:Y>...</foo:Y> </RowTemplate> </foo:X> ... 我的问题是:Y控件如何对数据上下文敏感?我知道我可以使用模板内联标记访问数据上下文:,但我无法将此信息传递给Y,因为服务器控件中不允许使用模板内联标记 因此,我不知道如何在Y中使

假设控件X有一个名为
RowTemplate
的模板

因此,X的标记类似于:

<foo:X>
    <RowTemplate>
        <foo:Y>...</foo:Y>
    </RowTemplate>
</foo:X>

...
我的问题是:Y控件如何对数据上下文敏感?我知道我可以使用模板内联标记访问数据上下文:
,但我无法将此信息传递给Y,因为服务器控件中不允许使用模板内联标记


因此,我不知道如何在Y中使用对象的Id(Eval(“Id”)。

通过向ItemDataBound事件(或foo:X控件上的其他类似事件)添加处理程序,您可以访问行模板中的控件。我的示例代码来自数据列表,因此您的事件处理程序可能会有所不同

在代码隐藏-连接事件处理程序中:

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);

    foo.ItemDataBound += new DataListItemEventHandler(foo_ItemDataBound);
}
然后在事件处理程序中,访问行中的控件。您的数据可能不是DataRow,因此请根据需要进行更改

void foo_ItemDataBound(object sender, DataListItemEventArgs e)
{
    Control fooY = (e.Item.FindControl("foo:Y") as Control); //Replace foo:Y with the ID for foo:Y
    DataRow data = e.Item.DataItem as DataRow;
    fooY.SomeProperty = data["id"];
}

@休伊特:我一直在寻找更直截了当的解决方案,但似乎你的解决方案是唯一可用的(或者没有其他更好的),所以我将实施这个。由于foo:X控件是我的,我将公开此事件,并在绑定每个项目后触发它。谢谢你抽出时间。