我一直关注以下帖子,在ListView控件中使用多个ItemTemplates。
虽然遵循这个例子确实产生了输出,但我正在尝试弄清楚如何将对象传递给ItemTemplate的用户控件,我似乎无法做到/弄清楚。
protected void lvwComments_OnItemCreated(object sender, ListViewItemEventArgs e)
{
ListViewDataItem currentItem = (e.Item as ListViewDataItem);
Comment comment = (Comment)currentItem.DataItem;
if (comment == null)
return;
string controlPath = string.Empty;
switch (comment.Type)
{
case CommentType.User:
controlPath = "~/layouts/controls/General Comment.ascx";
break;
case CommentType.Official:
controlPath = "~/layouts/controls/Official Comment.ascx";
break;
}
lvwComments.ItemTemplate = LoadTemplate(Controlpath);
}
用户控制如下:
public partial class OfficialComment : UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
在示例中,值在ascx页面中输出:
<%# Eval("ItemName") %>
但是我需要访问此控件中的ListItem来执行其他逻辑。我无法弄清楚如何通过我的评论项目发送。发件人对象和EventArgs不包含信息。
修改 理想情况下,我想获得一个解释,说明当使用&lt;%#Eval%&gt;时,控件如何访问dataitem。声明。我能够确定的是获得访问当前项目的以下方式:
我创建了一个自定义ListView控件,它设置了ItemCreating上的dataItemIndex。
在我的官方评论控件中,我添加以下内容:
List<Comment> commentList = ((CommentListView)this.Parent.Parent.Parent).DataSource as List<Comment>;
if (commentList != null)
{
int currentIndex = ((ListViewDataItem)this.Parent).DataItemIndex;
Comment currentItem = commentList[currentIndex];
}
答案 0 :(得分:0)
虽然有关于动态项目模板的文档,但没有任何示例可用于访问除&lt;%#Eval%&gt;之外的数据。功能。在尝试了一些方法后,我的问题中显示,我不喜欢递归遍历控制树。
我能够做的是创建一个继承自UserControl的类。这个类将定义我的DataItem:
public partial class ListViewTemplateControl<T> : UserControl where T : class
{
public T CurrentItem { get; set; }
}
然后,在我的ListView中,我可以执行以下操作:
protected void lvwComments_OnItemCreated(object sender, ListViewItemEventArgs e)
{
ListViewDataItem currentItem = (e.Item as ListViewDataItem);
Comment comment = (Comment)currentItem.DataItem;
if (comment == null)
return;
string controlPath = string.Empty;
switch (comment.Type)
{
case CommentType.User:
controlPath = "~/layouts/controls/General Comment.ascx";
break;
case CommentType.Official:
controlPath = "~/layouts/controls/Official Comment.ascx";
break;
}
ListViewTemplateControl<Comment> templateControl = LoadControl(controlPath) as ListViewTemplateControl<Comment>;
if (templateControl != null)
{
templateControl.CurrentItem = comment;
templateControl.ID = comment.ItemID;
lvwComments.Controls.Add(templateControl);
}
}
在我的模板控件中,我现在可以根据我传递的CurrentItem(DataItem)执行所有自定义逻辑。唯一需要注意的是&lt;%#Eval%&gt;功能现在不起作用。