如何使用ilist绑定repeater?

时间:2022-04-23 10:49:08
如何使用ilist绑定repeater?
我第一次使用ilist,
直接赋值,前台提示未找到title数据,我知道是因为没有创建相关列,但是如果要在其他地方创建好相应的dataview或者dataset在赋值给ilist接口的话,是不是还不如直接绑定dataset?
  if (Dr.Read())
            {
                
                list.Add(new ListItem(Dr["title"].ToString(), Dr["title"].ToString()));
                list.Add(new ListItem(Dr["Introduction"].ToString(),Dr["Introduction"].ToString()));
            }

请教下大家,我该怎么处理?还有一般大家用ilist绑定数据集怎么做的?

35 个解决方案

#1


用list绑定是个好习惯,dataset太臃肿,不过为了快速开发,还是会用到,是破坏面向对象的。list绑定方式其实和dataset也差不多,dataset是直接绑定数据库的表的列名,list是绑对象的属性名

#2


我想是因为你的List里装的是ListItem的原因吧,因为ListItem本身是一个特殊对象,list里为什么不放一个Model类呢?

#3


ListItem更适合在ListBox或DropDownList类型的控件里使用

#4


if (Dr.Read()) 
            { 
                
                list.Add(Dr["title"].ToString()); 
                list.Add(Dr["Introduction"].ToString());
            } 

这样应该可以

#5


帮顶,弟兄,请问泛型可以直接绑定到DataGrid中吗?
我写的一个程序为什么会丢失掉一个时间列。
老说没有哪个字段。
我看了字段没有错误,
第一次绑定是可以的。谢谢了啊!

#6


引用 4 楼 raincen 的回复:
if (Dr.Read())
            {
               
                list.Add(Dr["title"].ToString());
                list.Add(Dr["Introduction"].ToString());
            }

这样应该可以


这样同样也是会报repeater无title字段的,
我是这样定义的
 private static IList<String> GetDataSetParam()

#7


引用 5 楼 jack15850798154 的回复:
帮顶,弟兄,请问泛型可以直接绑定到DataGrid中吗?
我写的一个程序为什么会丢失掉一个时间列。
老说没有哪个字段。
我看了字段没有错误,
第一次绑定是可以的。谢谢了啊!

其实我和你一样,我一直是想不明白,如果这个泛指接口非要提供一个实体接口给他 然后在赋值给数据集,是不是有点多余呢?还不如直接把实体接口返回的值赋值给ilist呢

#8


你是08还是05呢?如果是08可以在list中放入一个有若干属性的匿名对象,如果是05则应该给一个对象,不然你在前台写Title,程序怎么知道哪个是Title?

#9


我想如果是GV应该没问题,因为Repeat需要手动设置绑定列

#10


引用 8 楼 raincen 的回复:
你是08还是05呢?如果是08可以在list中放入一个有若干属性的匿名对象,如果是05则应该给一个对象,不然你在前台写Title,程序怎么知道哪个是Title?

我用的是08,再问一下 什么叫 若干属性的匿名对象? 能不能稍微个一个例子?
是不是在private static IList <String> GetDataSetParam()写个什么?

#11


if (Dr.Read()) 
            { 
                
                list.Add( new { Title=Dr["title"].ToString() } ); 
                list.Add( new { Title=Dr["Introduction"].ToString() } );
            } 

#12


if (Dr.Read()) 应该是while(dr.Read())吧

#13


引用 11 楼 raincen 的回复:
if (Dr.Read())
            {
               
                list.Add( new { Title=Dr["title"].ToString() } );
                list.Add( new { Title=Dr["Introduction"].ToString() } );
            }

出错的。。
private static IList<string> GetDataSetParam()
        {
            string ConnectionString = ConfigurationManager.ConnectionStrings["Post_Detail"].ConnectionString;
            SqlConnection Connection = new SqlConnection(ConnectionString);
            SqlCommand cmd=new SqlCommand("Post_Detail",Connection);
            cmd.CommandType=CommandType.StoredProcedure;

            Connection.Open();
            SqlDataReader Dr = cmd.ExecuteReader();
            IList<string> list = new List<string>();
            if (Dr.Read())
            {
                list.Add(new { title = Dr["title"].ToString() });
                list.Add(new { Introduction = Dr["Introduction"].ToString() }); 

            }
            //adapter.Fill(ilst);
            Connection.Close();
            return list;
        }

#14


list.Add(new { title = Dr["title"].ToString() }); 
                list.Add(new { Introduction = Dr["Introduction"].ToString() }); 
这里报错

Error 1 The best overloaded method match for 'System.Collections.Generic.ICollection<string>.Add(string)' has some invalid arguments
Error 2 Argument '1': cannot convert from 'AnonymousType#1' to 'string'

#15


using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class TT : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
        {
            IList list = new ArrayList();
            list.Add(new ListItem("a", "001"));
            list.Add(new ListItem("b", "002"));
            list.Add(new ListItem("c", "003"));
            MyRepeater.DataSource = list;
            MyRepeater.DataBind();
        }
    }
}
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="TT.aspx.cs" Inherits="TT" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <table><tr>
   
    <asp:Repeater ID="MyRepeater" runat ="server">
        <ItemTemplate>
            </tr><td><%#((ListItem)Container.DataItem).Text %></td> 
            <td><%#((ListItem)Container.DataItem).Value  %></td> <tr>
        </ItemTemplate>    
    </asp:Repeater>
   
    </tr></table>
   
    </div>
    </form>
</body>
</html>

#16


 IList <string>限制了不能装匿名对象,我再想想

#17


引用 11 楼 raincen 的回复:
if (Dr.Read())
            {
               
                list.Add( new { Title=Dr["title"].ToString() } );
                list.Add( new { Title=Dr["Introduction"].ToString() } );
            }

我想知道这种写法正确的改怎么写,这样的写进去会报错的。、。

#18


引用 16 楼 raincen 的回复:
IList <string>限制了不能装匿名对象,我再想想

恩 谢谢 我这边也多试试先

#19


楼上通过改变绑定模板列属性可以的

#20


     { 
                
                list.Add( Dr["title"].ToString() ); 
                list.Add( Dr["Introduction"].ToString() ); 
            } 

#21


引用 20 楼 bancxc 的回复:
    {
               
                list.Add( Dr["title"].ToString() );
                list.Add( Dr["Introduction"].ToString() );
            }

这样前台用常规的绑定方式 绑定 <h3><%# DataBinder.Eval(Container.DataItem, "title", "{0}")%></h3>,绑定不了,找不到title的

#22


老兄同命人啊?我也是郁闷死了,
昨天回家测试了一下居然行了。
回到公司又是同一个问题。
我尝试直接用SQL语句通过DataTable绑定是对的。我不知道是不是DataGrid的绑定数据源不支持这种泛型啊?

#23


引用 19 楼 raincen 的回复:
楼上通过改变绑定模板列属性可以的

个人比较倾向于 <h3><%# DataBinder.Eval(Container.DataItem, "title", "{0}")%></h3>
这一类型的模板绑定,所以还想继续求教。。。

#24


引用 22 楼 jack15850798154 的回复:
老兄同命人啊?我也是郁闷死了,
昨天回家测试了一下居然行了。
回到公司又是同一个问题。
我尝试直接用SQL语句通过DataTable绑定是对的。我不知道是不是DataGrid的绑定数据源不支持这种泛型啊?

用datatable本来就是行的,我现在不想用这个。。。现在问题貌似集中到如何对前台的 title字段进行赋值,也就是创建title列、、、貌似又像table了。。

#25


我测试通过了


private static IList <string> GetDataSetParam() 
        { 
            string ConnectionString = ConfigurationManager.ConnectionStrings["Post_Detail"].ConnectionString; 
            SqlConnection Connection = new SqlConnection(ConnectionString); 
            SqlCommand cmd=new SqlCommand("Post_Detail",Connection); 
            cmd.CommandType=CommandType.StoredProcedure; 

            Connection.Open(); 
            SqlDataReader Dr = cmd.ExecuteReader(); 
            IList  list = new ArrayList(); 
           while (Dr.Read()) 
            { 
                list.Add(new { title = Dr["title"].ToString(),Introduction = Dr["Introduction"].ToString() }); 
            } 
            //adapter.Fill(ilst); 
            Connection.Close(); 
            return list; 
        }


前台绑定:
<%# Eval("title") %>
<%# Eval("Introduction") %>

#26


别忘把返回类型改为 IList

#27


一定要用IList  list = new ArrayList();?嘛~~~貌似list<string>不行哦

#28


list.Add(new { title = Dr["title"].ToString(),Introduction = Dr["Introduction"].ToString() }); 
            } 
因为这句话决定了,列表里装的是对象,而非一个字符串

#29


    #region 返回实体类年级表
        public static IList<GradeEntity> GetClassName()
        {
            IList<GradeEntity> className = new List<GradeEntity>();
            using (IDataReader dr = provider.GetReaderBySp("GetClass"))
            {
                while (dr.Read())
                {
                    GradeEntity grade = new GradeEntity();
                    grade.GradeId =int.Parse( dr["Class_Id"].ToString());
                    grade.Gradename = dr["Class_Name"].ToString();
                    grade.Gradeorder = dr["Class_Order"].ToString();
                    className.Add(grade);
                }
            }
            return className;
        }
        #endregion


 #region 返回实体类年级表
        public static IList<GradeEntity> GetClassName()
        {
            IList<GradeEntity> className = new List<GradeEntity>();
            using (IDataReader dr = provider.GetReaderBySp("GetClass"))
            {
                while (dr.Read())
                {
                    GradeEntity grade = new GradeEntity();
                    grade.GradeId =int.Parse( dr["Class_Id"].ToString());
                    grade.Gradename = dr["Class_Name"].ToString();
                    grade.Gradeorder = dr["Class_Order"].ToString();
                    className.Add(grade);
                }
            }
            return className;
        }
        #endregion

#30


引用 25 楼 raincen 的回复:
我测试通过了


private static IList <string> GetDataSetParam()
        {
            string ConnectionString = ConfigurationManager.ConnectionStrings["Post_Detail"].ConnectionString;
            SqlConnection Connection = new SqlConnection(ConnectionString);
            SqlCommand cmd=new SqlCommand("Post_Detail",Connection);
            cmd.CommandType=CommandType.StoredProcedure;

            Connection.Open();
            SqlDataReader Dr = cmd.ExecuteReader();
            IList  list = new ArrayList();
          while (Dr.Read())
            {
                list.Add(new { title = Dr["title"].ToString(),Introduction = Dr["Introduction"].ToString() });
            }
            //adapter.Fill(ilst);
            Connection.Close();
            return list;
        }


前台绑定:
<%# Eval("title") %>
<%# Eval("Introduction") %>


测试通过了,太感谢了。。。

我还想再问一句,如果  private static IList <string> GetDataSetParam()和private static IList GetDataSetParam()

2个返回的结果 是不是 IList <string>返回的必须是值是string的? IList返回的是匿名的,也就什么的可以接受的?

#31


Ilist<GradeEntity> list=GetClassName();
Repeater.DataSource=list;
Repeater.DataBind();

#32


如果你用List<string>就只能装String,那就跟前台的title没关系了,如果前台非要用Title则要么用楼上的实体类,要么用匿名对象,如果非要用List<string>绑定到GridView是没有问题的,因为前台不用手写绑定字段列,Gv会自动处理

#33


IList 装的是object

#34


引用 32 楼 raincen 的回复:
如果你用List <string>就只能装String,那就跟前台的title没关系了,如果前台非要用Title则要么用楼上的实体类,要么用匿名对象,如果非要用List <string>绑定到GridView是没有问题的,因为前台不用手写绑定字段列,Gv会自动处理


谢谢指导。。

#35


15楼都把解决方案清清楚楚的写出来了
用IList绑定到Repeater或GridView之类的,
要在前台转换成相应的类型进行处理,而不能简单的用Eval来处理
因为ListItem确实没有Title这个属性

但是如果绑定的是ListItem,你可以用Eval("Value")这种写法

#1


用list绑定是个好习惯,dataset太臃肿,不过为了快速开发,还是会用到,是破坏面向对象的。list绑定方式其实和dataset也差不多,dataset是直接绑定数据库的表的列名,list是绑对象的属性名

#2


我想是因为你的List里装的是ListItem的原因吧,因为ListItem本身是一个特殊对象,list里为什么不放一个Model类呢?

#3


ListItem更适合在ListBox或DropDownList类型的控件里使用

#4


if (Dr.Read()) 
            { 
                
                list.Add(Dr["title"].ToString()); 
                list.Add(Dr["Introduction"].ToString());
            } 

这样应该可以

#5


帮顶,弟兄,请问泛型可以直接绑定到DataGrid中吗?
我写的一个程序为什么会丢失掉一个时间列。
老说没有哪个字段。
我看了字段没有错误,
第一次绑定是可以的。谢谢了啊!

#6


引用 4 楼 raincen 的回复:
if (Dr.Read())
            {
               
                list.Add(Dr["title"].ToString());
                list.Add(Dr["Introduction"].ToString());
            }

这样应该可以


这样同样也是会报repeater无title字段的,
我是这样定义的
 private static IList<String> GetDataSetParam()

#7


引用 5 楼 jack15850798154 的回复:
帮顶,弟兄,请问泛型可以直接绑定到DataGrid中吗?
我写的一个程序为什么会丢失掉一个时间列。
老说没有哪个字段。
我看了字段没有错误,
第一次绑定是可以的。谢谢了啊!

其实我和你一样,我一直是想不明白,如果这个泛指接口非要提供一个实体接口给他 然后在赋值给数据集,是不是有点多余呢?还不如直接把实体接口返回的值赋值给ilist呢

#8


你是08还是05呢?如果是08可以在list中放入一个有若干属性的匿名对象,如果是05则应该给一个对象,不然你在前台写Title,程序怎么知道哪个是Title?

#9


我想如果是GV应该没问题,因为Repeat需要手动设置绑定列

#10


引用 8 楼 raincen 的回复:
你是08还是05呢?如果是08可以在list中放入一个有若干属性的匿名对象,如果是05则应该给一个对象,不然你在前台写Title,程序怎么知道哪个是Title?

我用的是08,再问一下 什么叫 若干属性的匿名对象? 能不能稍微个一个例子?
是不是在private static IList <String> GetDataSetParam()写个什么?

#11


if (Dr.Read()) 
            { 
                
                list.Add( new { Title=Dr["title"].ToString() } ); 
                list.Add( new { Title=Dr["Introduction"].ToString() } );
            } 

#12


if (Dr.Read()) 应该是while(dr.Read())吧

#13


引用 11 楼 raincen 的回复:
if (Dr.Read())
            {
               
                list.Add( new { Title=Dr["title"].ToString() } );
                list.Add( new { Title=Dr["Introduction"].ToString() } );
            }

出错的。。
private static IList<string> GetDataSetParam()
        {
            string ConnectionString = ConfigurationManager.ConnectionStrings["Post_Detail"].ConnectionString;
            SqlConnection Connection = new SqlConnection(ConnectionString);
            SqlCommand cmd=new SqlCommand("Post_Detail",Connection);
            cmd.CommandType=CommandType.StoredProcedure;

            Connection.Open();
            SqlDataReader Dr = cmd.ExecuteReader();
            IList<string> list = new List<string>();
            if (Dr.Read())
            {
                list.Add(new { title = Dr["title"].ToString() });
                list.Add(new { Introduction = Dr["Introduction"].ToString() }); 

            }
            //adapter.Fill(ilst);
            Connection.Close();
            return list;
        }

#14


list.Add(new { title = Dr["title"].ToString() }); 
                list.Add(new { Introduction = Dr["Introduction"].ToString() }); 
这里报错

Error 1 The best overloaded method match for 'System.Collections.Generic.ICollection<string>.Add(string)' has some invalid arguments
Error 2 Argument '1': cannot convert from 'AnonymousType#1' to 'string'

#15


using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class TT : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
        {
            IList list = new ArrayList();
            list.Add(new ListItem("a", "001"));
            list.Add(new ListItem("b", "002"));
            list.Add(new ListItem("c", "003"));
            MyRepeater.DataSource = list;
            MyRepeater.DataBind();
        }
    }
}
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="TT.aspx.cs" Inherits="TT" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <table><tr>
   
    <asp:Repeater ID="MyRepeater" runat ="server">
        <ItemTemplate>
            </tr><td><%#((ListItem)Container.DataItem).Text %></td> 
            <td><%#((ListItem)Container.DataItem).Value  %></td> <tr>
        </ItemTemplate>    
    </asp:Repeater>
   
    </tr></table>
   
    </div>
    </form>
</body>
</html>

#16


 IList <string>限制了不能装匿名对象,我再想想

#17


引用 11 楼 raincen 的回复:
if (Dr.Read())
            {
               
                list.Add( new { Title=Dr["title"].ToString() } );
                list.Add( new { Title=Dr["Introduction"].ToString() } );
            }

我想知道这种写法正确的改怎么写,这样的写进去会报错的。、。

#18


引用 16 楼 raincen 的回复:
IList <string>限制了不能装匿名对象,我再想想

恩 谢谢 我这边也多试试先

#19


楼上通过改变绑定模板列属性可以的

#20


     { 
                
                list.Add( Dr["title"].ToString() ); 
                list.Add( Dr["Introduction"].ToString() ); 
            } 

#21


引用 20 楼 bancxc 的回复:
    {
               
                list.Add( Dr["title"].ToString() );
                list.Add( Dr["Introduction"].ToString() );
            }

这样前台用常规的绑定方式 绑定 <h3><%# DataBinder.Eval(Container.DataItem, "title", "{0}")%></h3>,绑定不了,找不到title的

#22


老兄同命人啊?我也是郁闷死了,
昨天回家测试了一下居然行了。
回到公司又是同一个问题。
我尝试直接用SQL语句通过DataTable绑定是对的。我不知道是不是DataGrid的绑定数据源不支持这种泛型啊?

#23


引用 19 楼 raincen 的回复:
楼上通过改变绑定模板列属性可以的

个人比较倾向于 <h3><%# DataBinder.Eval(Container.DataItem, "title", "{0}")%></h3>
这一类型的模板绑定,所以还想继续求教。。。

#24


引用 22 楼 jack15850798154 的回复:
老兄同命人啊?我也是郁闷死了,
昨天回家测试了一下居然行了。
回到公司又是同一个问题。
我尝试直接用SQL语句通过DataTable绑定是对的。我不知道是不是DataGrid的绑定数据源不支持这种泛型啊?

用datatable本来就是行的,我现在不想用这个。。。现在问题貌似集中到如何对前台的 title字段进行赋值,也就是创建title列、、、貌似又像table了。。

#25


我测试通过了


private static IList <string> GetDataSetParam() 
        { 
            string ConnectionString = ConfigurationManager.ConnectionStrings["Post_Detail"].ConnectionString; 
            SqlConnection Connection = new SqlConnection(ConnectionString); 
            SqlCommand cmd=new SqlCommand("Post_Detail",Connection); 
            cmd.CommandType=CommandType.StoredProcedure; 

            Connection.Open(); 
            SqlDataReader Dr = cmd.ExecuteReader(); 
            IList  list = new ArrayList(); 
           while (Dr.Read()) 
            { 
                list.Add(new { title = Dr["title"].ToString(),Introduction = Dr["Introduction"].ToString() }); 
            } 
            //adapter.Fill(ilst); 
            Connection.Close(); 
            return list; 
        }


前台绑定:
<%# Eval("title") %>
<%# Eval("Introduction") %>

#26


别忘把返回类型改为 IList

#27


一定要用IList  list = new ArrayList();?嘛~~~貌似list<string>不行哦

#28


list.Add(new { title = Dr["title"].ToString(),Introduction = Dr["Introduction"].ToString() }); 
            } 
因为这句话决定了,列表里装的是对象,而非一个字符串

#29


    #region 返回实体类年级表
        public static IList<GradeEntity> GetClassName()
        {
            IList<GradeEntity> className = new List<GradeEntity>();
            using (IDataReader dr = provider.GetReaderBySp("GetClass"))
            {
                while (dr.Read())
                {
                    GradeEntity grade = new GradeEntity();
                    grade.GradeId =int.Parse( dr["Class_Id"].ToString());
                    grade.Gradename = dr["Class_Name"].ToString();
                    grade.Gradeorder = dr["Class_Order"].ToString();
                    className.Add(grade);
                }
            }
            return className;
        }
        #endregion


 #region 返回实体类年级表
        public static IList<GradeEntity> GetClassName()
        {
            IList<GradeEntity> className = new List<GradeEntity>();
            using (IDataReader dr = provider.GetReaderBySp("GetClass"))
            {
                while (dr.Read())
                {
                    GradeEntity grade = new GradeEntity();
                    grade.GradeId =int.Parse( dr["Class_Id"].ToString());
                    grade.Gradename = dr["Class_Name"].ToString();
                    grade.Gradeorder = dr["Class_Order"].ToString();
                    className.Add(grade);
                }
            }
            return className;
        }
        #endregion

#30


引用 25 楼 raincen 的回复:
我测试通过了


private static IList <string> GetDataSetParam()
        {
            string ConnectionString = ConfigurationManager.ConnectionStrings["Post_Detail"].ConnectionString;
            SqlConnection Connection = new SqlConnection(ConnectionString);
            SqlCommand cmd=new SqlCommand("Post_Detail",Connection);
            cmd.CommandType=CommandType.StoredProcedure;

            Connection.Open();
            SqlDataReader Dr = cmd.ExecuteReader();
            IList  list = new ArrayList();
          while (Dr.Read())
            {
                list.Add(new { title = Dr["title"].ToString(),Introduction = Dr["Introduction"].ToString() });
            }
            //adapter.Fill(ilst);
            Connection.Close();
            return list;
        }


前台绑定:
<%# Eval("title") %>
<%# Eval("Introduction") %>


测试通过了,太感谢了。。。

我还想再问一句,如果  private static IList <string> GetDataSetParam()和private static IList GetDataSetParam()

2个返回的结果 是不是 IList <string>返回的必须是值是string的? IList返回的是匿名的,也就什么的可以接受的?

#31


Ilist<GradeEntity> list=GetClassName();
Repeater.DataSource=list;
Repeater.DataBind();

#32


如果你用List<string>就只能装String,那就跟前台的title没关系了,如果前台非要用Title则要么用楼上的实体类,要么用匿名对象,如果非要用List<string>绑定到GridView是没有问题的,因为前台不用手写绑定字段列,Gv会自动处理

#33


IList 装的是object

#34


引用 32 楼 raincen 的回复:
如果你用List <string>就只能装String,那就跟前台的title没关系了,如果前台非要用Title则要么用楼上的实体类,要么用匿名对象,如果非要用List <string>绑定到GridView是没有问题的,因为前台不用手写绑定字段列,Gv会自动处理


谢谢指导。。

#35


15楼都把解决方案清清楚楚的写出来了
用IList绑定到Repeater或GridView之类的,
要在前台转换成相应的类型进行处理,而不能简单的用Eval来处理
因为ListItem确实没有Title这个属性

但是如果绑定的是ListItem,你可以用Eval("Value")这种写法