黑马程序员技术交流社区

标题: 关于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上面讲很详细)
      以下是相关几个接口的定义
  1. [ComVisible(true), Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A"), __DynamicallyInvokable]
  2. public interface IEnumerable
  3. {
  4.     [DispId(-4), __DynamicallyInvokable]
  5.     IEnumerator GetEnumerator();
  6. }

  7. [__DynamicallyInvokable]
  8. public interface IEnumerator<out T> : IDisposable, IEnumerator
  9. {
  10.     // Properties
  11.     [__DynamicallyInvokable]
  12.     T Current { [__DynamicallyInvokable] get; }
  13. }
  14. [ComVisible(true), Guid("496B0ABF-CDEE-11d3-88E8-00902754C43A"), __DynamicallyInvokable]
  15. public interface IEnumerator
  16. {
  17.     [__DynamicallyInvokable]
  18.     bool MoveNext();
  19.     [__DynamicallyInvokable]
  20.     object Current { [__DynamicallyInvokable] get; }
  21.     [__DynamicallyInvokable]
  22.     void Reset();
  23. }
复制代码
2解决楼主问题:
      1报错原因: System.Web.UI.WebControls.DataList类型定义:  public class DataList : BaseDataList, INamingContainer, IRepeatInfoUser, IWizardSideBarListControl  表明其并未实现IEnumerable接口 不支持foreach语句
      2解决方法:IWizardSideBarListControl  接口定义
  1. internal interface IWizardSideBarListControl
  2. {
  3.     // Events
  4.     abstract event CommandEventHandler ItemCommand;
  5.     abstract event EventHandler<WizardSideBarListControlItemEventArgs> ItemDataBound;

  6.     // Methods
  7.     void DataBind();

  8.     // Properties
  9.     object DataSource { get; set; }
  10.     IEnumerable Items { get; }
  11.     ITemplate ItemTemplate { get; set; }
  12.     int SelectedIndex { get; set; }
  13. }
复制代码
可以看到有个 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