为什么不能这么声明DataSource?

zhjzh_zjz 2007-12-06 08:45:56
方法一:
<script runat="server">
private ArrayList GetSource()
{
ArrayList al = new ArrayList();
... ...
return al;
}
protected void Page_Load(object sender, EventArgs e)
{
GridView1.DataSource = GetSource();
GridView1.DataBind();
}
</script>

<asp:GridView ID="GridView1" runat="server" DataSource="GetSource()">
<Columns>
<asp:BoundField DataField="Email" HeaderText="电子邮件" />
</Columns>
</asp:GridView>

方法二
<script runat="server">
private ArrayList GetSource()
{
ArrayList al = new ArrayList();
... ...
return al;
}

</script>

<asp:GridView ID="GridView1" runat="server" DataSource="GetSource()">
<Columns>
<asp:BoundField DataField="Email" HeaderText="电子邮件" />
</Columns>
</asp:GridView>

为什么方法一正确,而方法二会出错误 不能以声明的方式设置“DataSource”属性

我感觉两种方式的效果应该是一样的,为什么会出这种错误呢?请高手指点
...全文
668 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccli_007 2011-05-02
  • 打赏
  • 举报
回复
学习学习学习
uuyi 2008-05-29
  • 打赏
  • 举报
回复
学习
liujinyang0511 2007-12-07
  • 打赏
  • 举报
回复
cat_hsfz正确

up
duoduo123 2007-12-07
  • 打赏
  • 举报
回复
改成 publice试一下呢
浪漫幕末 2007-12-07
  • 打赏
  • 举报
回复
关注中,
zhjzh_zjz 2007-12-07
  • 打赏
  • 举报
回复
<%=...%> 是在Render中输出的,相当于 Response.Write ,在服务器端控件中,这种写法行不通的
浪漫幕末 2007-12-07
  • 打赏
  • 举报
回复
<%=...%>是在程序执行时调用,<%#... %>是在DataBind()方法之后被调用
所以使用<%# %>没数据是正常的,因为绑定结束了才赋的数据源
zhjzh_zjz 2007-12-07
  • 打赏
  • 举报
回复
DataSource=" <%=GerSource()%>
更不行了,呵呵,直接出错。如果是客户端控件,这样可以。这是服务器端控件,不能这样输出的,呵呵。服务器端控件实现要经过服务器解析的。你这种方式向客户端输出的
浪漫幕末 2007-12-07
  • 打赏
  • 举报
回复
DataSource="<%=GerSource()%>
zhjzh_zjz 2007-12-07
  • 打赏
  • 举报
回复
cat_hsfz 大侠理解的很深刻。但是我想肯定有简单一点的解决办法。按理说用绑定应该是可以的
zhjzh_zjz 2007-12-07
  • 打赏
  • 举报
回复
用 lihui_830501 的方法也不行。改成DataSource="<%#GerSource()%>" 不出错误了,但是没有结果。是空的。我感觉DataSource="<%#GerSource()%>" 应该是可以的,但是为什么没有结果呢?我见别人这样做过,是可以的,为什么我这样不行呢?
cat_hsfz 2007-12-07
  • 打赏
  • 举报
回复
那么简单的事情我都看错……汗……是这样的,对于ASPX中的文本,有parser决定如何处理,例如Visible="false",显然parser要懂得这不是一个字符串的"false",否则就赋值类型错误,它要专门标记为将此字符串识别为Boolean的false。

因此,在DataSource="GetSource()"里面,parser是没有那么“高级”能够理解这是GetSource()的结果,因此这样做是不行的。你一定要这样做,只能自己去继承有关的parser,通过reflection为此属性的解析提供这样高级的功能。
DePaul 2007-12-07
  • 打赏
  • 举报
回复
DataSource="<%=GetSource()%>"

private ArrayList GetSource()
改成protected ArrayList GetSource()
qq22345111 2007-12-07
  • 打赏
  • 举报
回复
两种方式都没使用
直接使用DataSet绑定!!
汗!
zhjzh_zjz 2007-12-07
  • 打赏
  • 举报
回复
不行,改成 protected 还是不行,还没找到真正原因
DavidNoWay 2007-12-07
  • 打赏
  • 举报
回复
zhjzh_zjz 2007-12-07
  • 打赏
  • 举报
回复
我发现这是一个解析的先后问题,只需要在 Page_Load(){DataBind();}
所有的用<%#GetSource() %> 就都没有问题了。

cat_hsfz 可否给我解释一下,为什么 他不会自动调用 DataBind() ?
suyiming 2007-12-06
  • 打赏
  • 举报
回复
cat_hsfz
己经说过了...
protect和private的区别.....
liuyun1987 2007-12-06
  • 打赏
  • 举报
回复
cat_hsfz
己经说过了...
protect和private的区别.....
cat_hsfz 2007-12-06
  • 打赏
  • 举报
回复
因为GetSource()是private而不是protected或public的,你改为protected的就行了。

具体原因,是因为aspx编译的类是继承自code behind编译的类,因此aspx中的代码以code behind子类方式执行,子类怎么能调用父类private函数呢?要注意,这是真相,而Microsoft总是对此含糊其辞,误导入门者说aspx和code behind是合并变异为一个类。你想更深入的了解这个话题的话,可以来参考我的文章:
http://www.cnblogs.com/cathsfz/archive/2006/11/05/550985.html
加载更多回复(4)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧