0

我创建了一个类来完成一些工作,例如从 System.Web.UI.WebControls.WebControl 继承的 GridView。

public class IHGridView : System.Web.UI.WebControls.WebControl
{
    // inside here, actually return Repeater class.


    protected override void OnInit(EventArgs e)
    {
        _repeater.ItemTemplate = new IHGridItemTemplate(ListItemType.Item, this.Columns);
        this.Controls.Add(_repeater);
    }
}

我还在 IHGridView 中为我的转发器创建了 ItemTemplate。

public class IHGridItemTemplate : ITemplate
{
}

IHGridView 类返回Repeater 和一些html 代码,但为了方便开发,我创建了一些东西。

public class Columns : StateManagedCollection
{
}

public class IHBoundFieldBase : IStateManager
{
}

public class IHLabelField : IHBoundFieldBase
{
}

现在在我的 aspx 中,我可以像下面这样使用它:

<cc1:IHGridView ID="IHGridView1" runat="server" EditMode="View">
    <Columns>
         <cc1:IHLabelField ID="IHLabelField7" DataField="PERSON_NAME" HeaderText="PersonName" />
    </Columns>
</cc1:IHGridView>

现在我想出了一个问题。我不能在 aspx 中使用 DataBinder.Eval。

<cc1:IHLabelField ID="IHLabelField7" HeaderText="PersonName" Text='<%# DataBinder.Eval(Container.DataItem, "PERSON_NAME") %>' />

这给了我一个错误。错误消息如下: CS1061:“System.Web.UI.Control”中没有“DataItem”的定义。“System.Web.UI.Control”的第一个参数中没有可扩展的方法“DataItem”。请检查是否有使用量规或汇编参考。这是用韩文写的,但我翻译成英文。谁能给我一个线索来解决这个问题?

4

2 回答 2

1

在模板化控件中,模板在容器中实例化。为了在模板化字段中进行数据绑定,建议容器应实现IDataItemContainer接口 - 接口实现应提供数据项。

AFAIK,为了支持数据绑定表达式,ASP.NET 解析器DataBinding为控件(其属性使用这些表达式)注入事件处理程序,然后在处理程序中,它生成在容器中查找数据项的代码。

因此,在您的示例中,如果您希望在IHLabelField.Text属性中使用数据绑定表达式,则控件的命名容器应该实现IDataItemContainer或应该具有DataItem属性。DataItem所以在这种情况下,你可能需要IHGridView控制——它不会按照你想要的方式工作。

于 2011-11-04T09:16:40.100 回答
0

这是我们使用的一个例子。我希望它有帮助

   <asp:HyperLink ID="phoneManagementHyperLink" runat="server" Text='<%# (Container.DataItem as WcfUser).firstName + " " + (Container.DataItem as WcfUser).lastName%>'

于 2017-03-14T13:56:21.910 回答