【发布时间】:2015-02-03 19:39:06
【问题描述】:
我有一个包含网格视图的页面我有 AutoGenerateColumns="False" 并且在我有的网格视图内 一些 asp:BoundFields 和一个 asp:TemplateField
<asp:TemplateField>
<ItemTemplate>
<asp:HyperLink runat="server" NavigateUrl='<%# "~/BaseAndRepeats.aspx?id=" + Eval("ID") %>' Text="Test1"></asp:HyperLink>
<asp:HyperLink runat="server" NavigateUrl='<%# "~/BaseAndRepeats.aspx?id=" + Eval("description") %>' Text="Test2"></asp:HyperLink>
</ItemTemplate>
</asp:TemplateField>
ID & description 从实际数据源中的当前项目(当前行)检索属性。
我真的很想做这样的事情(即同一行上的多个控件的外观 取决于该行的数据以及相关数据)以编程方式
所以我在我的页面加载 (sn-p) 中做了这样的事情
ROTAEntities1 RE = new ROTAEntities1();
List<Value_Result> _list = RE.myproc(myparam).ToList();
TemplateField tf = new TemplateField();
tf.ItemTemplate = new OwnedEventsPage.MyTemplate(RE, _list);
GridView1.Columns.Add(tf);
this.GridView1.DataSource = _list;
this.GridView1.DataBind();
但是在 InstantiateIn 中,我似乎也找不到通过容器访问当前行数据的方法 在网格或数据源中。因此,我将数据源和我可能需要的任何其他内容传递给构建模板和 使用成员 int 来跟踪行。
但是这意味着模板和 InstantiateIn 不支持 自身稳定,但依赖于许多假设
- 模板新建并在绑定前添加
- 绑定发生在此之后
- InstantiateIn 始终按数据源行顺序调用
参见下面的 sn-p:
private class MyTemplate : ITemplate
{
ROTAEntities1 RE;
int rowCount = 0;
List<ListOwnedBaseEvents_Result> mylist;
public MyTemplate(ROTAEntities1 _re, List<Value_Result> _list)
{
RE = _re;
mylist = _list;
}
public void InstantiateIn(System.Web.UI.Control container)
{
// can obtain the current DataControlFieldCell but cannot seem to access the
// current grid or datasource row
DataControlFieldCell dcfc = (DataControlFieldCell)container;
int id = mylist[rowCount].ID;
rowCount++;
// then I go on to create controls and add to the container
// making use of id, mylist and other related data entities in RE
//
...
}
有没有办法让 InstantiateIn 独立地知道当前数据源行是什么 因为它正在构建和添加控件,就像我在 的aspx。我认为这样会更安全。
希望这是有道理的。
谢谢。
【问题讨论】: