将对象传递给动态加载的ListView ItemTemplate

时间:2010-04-16 06:30:45

标签: c# asp.net listview

我一直关注以下帖子,在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];
}

1 个答案:

答案 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;功能现在不起作用。