原先一直都是在Web页面里直接从数据库里读信息到DataSet里,然后 GridView.DataSource=DataSet,而对于GridView里显示列的绑定也是根据Web页面的SQL语句的返回字段设置,比如sql语句为"select id,name from users",那么在GridView里如果要显示id和name,就需要在GridView里绑定id和name,如下所示:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:BoundField DataField="id" HeaderText="序号" />
<asp:BoundField DataField="name" HeaderText="项目" />
</Columns>
</asp:GridView>
今天尝试将一个IList类型的数据集绑定到GridView.DataSource,
Sql语句依然是select id,name from users,但是此次并不是直接获取,而是先将获取的id和name赋值给一个user类的两个属性userid和username,然后将user类添加到一个IList,再将IList绑定给DataSource,代码如下:
IList noticelist = GetNoticeList(ID);
GridView1.DataSource = noticelist;
GridView1.DataBind();
public IList GetNoticeList(int id)
{
IList NoticeList = new ArrayList();
ENotice notice = null;
SqlParameter parm = new SqlParameter(PARAM_ID, SqlDbType.BigInt, 8);
parm.Value = id;
using (SqlDataReader sdr = SqlHelper.ExecuteReader(SqlHelper.CONN_STR, CommandType.Text, SQL_SELECT_RNOTICE, parm))
{
while (sdr.Read())
{
notice = new ENotice(sdr.GetInt32(0), sdr.GetString(1));
NoticeList.Add(notice);
}
}
return NoticeList;
}
如果GridView在绑定数据时,还是如上面所示,datafield为id和name,那就会报错,说“在选定的数据源上未找到名为“id”的字段或属性。”。
解决办法,将GridView的DataField字段改为userid和username,如下所示:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:BoundField DataField="userid" HeaderText="序号" />
<asp:BoundField DataField="username" HeaderText="项目" />
</Columns>
</asp:GridView>
也就是GridView要根据IList里的字段来绑定,而从GetNoticeList函数里可以看到IList里是以notice类为单位添加的,因此GridView的DataField字段要根据sql字段绑定到的notice类里的属性字段来定。