黑马程序员技术交流社区
标题:
关于Asp.Net后台遍历DataList中控件
[打印本页]
作者:
咖喱猫
时间:
2013-7-19 19:45
标题:
关于Asp.Net后台遍历DataList中控件
本帖最后由 咖喱猫 于 2013-7-20 23:11 编辑
file:///D:/DataList.png
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
PsotPageIndex = 1;
BindListPageCount();
SetButtonStatus();
BindDataList();
if ( Session["CurrentUser"] !=null)
{
Users u = Session["CurrentUser"] as Users;
if (!u.UserRole.Equals("Admin"))
{
foreach (DataListItem item in DataListBlogs)
{
HyperLink hl = (HyperLink)item.FindControl("hlkEdit");
hl.Visible = false;
}
}
}
}
}
错误 4 “System.Web.UI.WebControls.DataList”不包含“GetEnumerator”的公共定义,因此 foreach 语句不能作用于“System.Web.UI.WebControls.DataList”类型的变量
为什么会出现这种错误?
作者:
sxdxgzr@126.com
时间:
2013-7-19 21:05
本帖最后由 sxdxgzr@126.com 于 2013-7-19 21:06 编辑
1原理:支持foreach语法要求数据源A实现了IEnumerable接口 ,这个可以用ilasm.exe 工具查看含有foreach代码块生成的IL,可以看到生成的相应的IL包含调用GetEnumerator()方法,该方法返回一个实现了IEnumerator<out T>接口的迭代器对象,返回的迭代器调用了 MoveNext()方法并将 Current值返回,处理完后继续调用MoveNext()方法,至数据源数据都被访问。(其他就不罗嗦了 msdn上面讲很详细)
以下是相关几个接口的定义
[ComVisible(true), Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A"), __DynamicallyInvokable]
public interface IEnumerable
{
[DispId(-4), __DynamicallyInvokable]
IEnumerator GetEnumerator();
}
[__DynamicallyInvokable]
public interface IEnumerator<out T> : IDisposable, IEnumerator
{
// Properties
[__DynamicallyInvokable]
T Current { [__DynamicallyInvokable] get; }
}
[ComVisible(true), Guid("496B0ABF-CDEE-11d3-88E8-00902754C43A"), __DynamicallyInvokable]
public interface IEnumerator
{
[__DynamicallyInvokable]
bool MoveNext();
[__DynamicallyInvokable]
object Current { [__DynamicallyInvokable] get; }
[__DynamicallyInvokable]
void Reset();
}
复制代码
2解决楼主问题:
1报错原因: System.Web.UI.WebControls.DataList类型定义: public class DataList : BaseDataList, INamingContainer, IRepeatInfoUser, IWizardSideBarListControl 表明其并未实现IEnumerable接口 不支持foreach语句
2解决方法:IWizardSideBarListControl 接口定义
internal interface IWizardSideBarListControl
{
// Events
abstract event CommandEventHandler ItemCommand;
abstract event EventHandler<WizardSideBarListControlItemEventArgs> ItemDataBound;
// Methods
void DataBind();
// Properties
object DataSource { get; set; }
IEnumerable Items { get; }
ITemplate ItemTemplate { get; set; }
int SelectedIndex { get; set; }
}
复制代码
可以看到有个 IEnumerable Items { get; }属性 而System.Web.UI.WebControls.DataList类型实现了此属性,楼主foreach里面可以用这个属性完成相应的功能。
作者:
于驭龙
时间:
2013-7-20 23:20
如果只是取一个对象 完全没必要循环遍历datalist
自带的事件里面的e 对象触发能找到当前行的下标
在用datakey里面设置的你想要的列就行了.映射出来就能用了
而且你遍历的是控件本身 本不是控件下面的集合
foreach(DataListItem item in this.DataList1.Items)
这个才对
个人认为datalist一列多行 一行多列模式..实在不需
遍历..
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2