asp.net 中的 DataBinder.Eval 错误
我创建了一个类来执行一些工作,例如 GridView 继承自 System.Web.UI.WebControls.WebControl。
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”。请检查是否有使用标题或程序集参考。这是用韩文写的,但我翻译成英文。 有人能给我解决这个问题的线索吗?
I have created a class doing some jobs like GridView inherit from System.Web.UI.WebControls.WebControl.
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);
}
}
I also created ItemTemplate for my repeater in IHGridView.
public class IHGridItemTemplate : ITemplate
{
}
IHGridView class returns Repeater and some html codes, but in convenience to deveop I have created some stuff.
public class Columns : StateManagedCollection
{
}
public class IHBoundFieldBase : IStateManager
{
}
public class IHLabelField : IHBoundFieldBase
{
}
Now in my aspx, I can use this like below:
<cc1:IHGridView ID="IHGridView1" runat="server" EditMode="View">
<Columns>
<cc1:IHLabelField ID="IHLabelField7" DataField="PERSON_NAME" HeaderText="PersonName" />
</Columns>
</cc1:IHGridView>
Now I come up with a problem.
I cannot use DataBinder.Eval in aspx.
<cc1:IHLabelField ID="IHLabelField7" HeaderText="PersonName" Text='<%# DataBinder.Eval(Container.DataItem, "PERSON_NAME") %>' />
This gives me an error.
The error message is below: CS1061: There is no definition of 'DataItem' in 'System.Web.UI.Control'. There is no extendable method 'DataItem' in 'System.Web.UI.Control''s first argument. Please check if there is using rubric or assembly reference. This was written in Korean, but I translated into English.
Could anyone give me a clue to solve this problem?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在模板化控件中,模板在容器中实例化。为了使数据绑定在模板化字段中工作,建议容器应实现 IDataItemContainer 接口 - 接口实现应该提供数据项。
AFAIK,为了支持数据绑定表达式,ASP.NET 解析器为控件(其属性使用这些表达式)注入
DataBinding
事件的处理程序,然后在处理程序中,它生成在中查找数据项的代码容器。因此,在您的示例中,如果您希望在
IHLabelField.Text
属性中使用数据绑定表达式,则控件的命名容器应实现IDataItemContainer
或应具有DataItem
属性。因此,在这种情况下,您可能需要IHGridView
控件上的DataItem
- 但它不会按您想要的方式工作。In templated controls, the template is instantiated in the container. For data-binding to work in the templated fields, its recommended that container should implement IDataItemContainer interface - the interface implementation should be supplying the data-item.
AFAIK, to support data binding expressions, ASP.NET parser injects handler for
DataBinding
event for the control (whose properties uses these expressions) and then in the handler, it generates code that looks for data-item in the container.So in your example, if you wish to use data-binding expression in the
IHLabelField.Text
property then the control's naming container should either implementIDataItemContainer
or should haveDataItem
property. So in this case, you will probably needDataItem
onIHGridView
control - and it wouldn't work the way you want.这是我们使用的一个例子。我希望它有帮助
here is an example we used. i hope it helps