数据绑定后从RepeaterItem检索DataItem(在事件处理程序期间)

时间:2009-04-14 17:49:32

标签: c# asp.net data-binding repeater

我正试图找到一种方法来做一些我认为必须可行的事情,但我只是忽略了这一点 - 所以希望有人可以给我一点推动:)

我在ASP.NET中使用数据绑定(关闭视图状态 - 所以在这里和那里使用controlstate进行一些操作)来渲染在每个itemtemplate(repeaterPriceBands)中都有转发器的转发器(repeaterPriceClasses)。基本上,这会从一些文本和每个单元格中的下拉列表中呈现一个表格。

我正在尝试找到一种方法来枚举按钮的事件处理程序中的repeaterOuter,以便为我提供所有最初绑定元素的列表,这些元素现在有一个值为> 0的下拉列表,以及这个价值是什么。

public Dictionary<Price, int> SelectedPrices
{
    get
    {
        var sel = new Dictionary<Price, int>();
        foreach(RepeaterItem itemClass in repeaterPriceClasses.Items)
        {
            var repeaterPriceBands = itemClass.FindControl("repeaterPriceBands") as Repeater;

            foreach(RepeaterItem itemBand in repeaterPriceBands.Items)
            {
                var context = (Price)itemBand.DataItem;
                var listQty = itemBand.FindControl("listQty") as DropDownList;

                if(listQty.SelectedValue.ToInt32() > 0)
                {
                    sel.Add(context, listQty.SelectedValue.ToInt32());
                }
            }
        }
        return sel;
    }
}

现在这会失败,因为在数据绑定完成后,itemBand.DataItem始终为null。

我应该用什么技巧来解决这个问题?

  1. 包含主键的隐藏字段 (不是理想的可以滥用和补充 重量到页面)

  2. 从中查找 基于索引的原始缓存数据 (似乎错了)

  3. 或其他什么 其他/更好的...?

  4. 编辑:我可以提供更多信息来帮助我们获得答案吗?

1 个答案:

答案 0 :(得分:1)

当DataItem可用时,您可以尝试在ItemDataBound事件中为HTML元素添加额外的属性。

ddlSomething.Attributes["Attribute1"] = dataItemObject.PropertyName;

[编辑] 除了使用属性之外,您还可以为每一行渲染一些包含这样的JSON对象的数组。

var repeaterItemAttributes = [ { Prop1: val1, Prop2: val2, ... }, { ... }, ... ]

因此,通过使用它,您将不必呈现属性,并且您的代码也将符合XHTML(这不是必需的)。然后,您可以遍历对象数组并读取您喜欢的任何属性。您还可以将您正在讨论的轻量加密应用于属性值。 [/编辑]