具体问题如下:
安装好vs2008,然后新建asp.net Web应用程序项目,拷贝AjaxControlToolkit.dll文件到项目目录下,添加AjaxControlToolkit的选项卡,并添加全部控件。新建一个空白页面,切换到设计视图,拖一个ScriptManager,再拖一个Accordion,然后切换到源视图,选中刚才拖的Accordion,应该叫Accordion1。在属性窗口中查看Accordion1的各项属性,发现有一个Panes属性。选中,添加几个AccordionPane,确定。然后页面切换到设计视图,发现Accordion1报错:创建控件时出错 - Accordion1类型“AjaxControlToolkit.Accordion”不具有名为“AccordionExtender”的公共属性。
再查看源视图,发现Accordion1里面增加了<ajaxToolkit:AccordionExtender ID="Accordion1_AccordionExtender" runat="server"
Enabled="True" TargetControlID="Accordion1"></ajaxToolkit:AccordionExtender>这样的代码,参考AjaxControlToolkit的例子程序,发现添加的AccordionPane应该包括在<Panes></Panes>之间。手工去掉AccordionExtender相关代码,并增加<Panes></Panes>,将AccordionPane包含到<Panes></Panes>之间,再进入设计视图,发现又报错:呈现控件时出错 - Accordion1发生了未处理的异常。
集合已修改;可能无法执行枚举操作。
以上问题我百思不得其解,在网上查找资料,都是语焉不详,要么要我检查环境配置,要么只提出问题没有给出解决办法。我只有自己想办法解决。
打开微软的例子程序页面,复制它的代码到页面
<ajaxToolkit:Accordion去掉不相关的部分,发现控件呈现和运行都没问题。我试着将这段代码中的AccordionPane的相关属性去掉,发现去掉
ID="MyAccordion"
runat="Server"
SelectedIndex="0"
HeaderCssClass="accordionHeader"
HeaderSelectedCssClass="accordionHeaderSelected"
ContentCssClass="accordionContent"
AutoSize="None"
FadeTransitions="true"
TransitionDuration="250"
FramesPerSecond="40"
RequireOpenedPane="false"
SuppressHeaderPostbacks="true">
<Panes>
<ajaxToolkit:AccordionPane
HeaderCssClass="accordionHeader"
HeaderSelectedCssClass="accordionHeaderSelected"
ContentCssClass="accordionContent">
<Header> . . . </Header>
<Content> . . . </Content>
</ajaxToolkit:AccordionPane>
.
.
.
</Panes>
<HeaderTemplate>...</HeaderTemplate>
<ContentTemplate>...</ContentTemplate>
</ajaxToolkit:Accordion>
ContentCssClass="accordionContent" HeaderCssClass="accordionHeader" 或设置ContentCssClass="" HeaderCssClass=""将报控件呈现错误。而设计器添加的AccordionPane以上两项属性都是空的,估计AccordionPane的 ContentCssClass和HeaderCssClass属性都不能为空。为了验证我的猜测,我删除了拷贝自微软的例子代码,再新增一个Accordion1,然后进入源视图,手工增加<Panes></Panes>,然后从工具箱上直接拖两个AccordionPane到<Panes></Panes>之间(这个方法是试出来的)。然后设置新增的AccordionPane的HeaderCssClass="accordionHeader" ContentCssClass="accordionContent" ,再进入设计视图,OK,一切正常。
总结:
1、从设计器中的panes添加AccordionPane出现错误是Accordion控件的一个bug,解决方法就是添加Accordion后手工增加<Panes></Panes>然后直接从工具箱中拖AccordionPane。
2、新增的AccordionPane如果不修改HeaderCssClass="accordionHeader" ContentCssClass="accordionContent"报呈现错误是Accordion的第二个bug,可以通过修改AccordionPane的源代码实现,如果不想修改就只有手动修改了。
附
AjaxControlToolkit.dll文件的获得方法:
1、在http://asp.net/ajax上下载ajaxcontroltoolkit-framework3.5-nosource.zip,解开,得到AjaxControlExtender.vsi,将这个文件的扩展名改成.zip,然后解压,在解压的目录下得到AjaxControlExtenderProjectCS.zip,再解压,就得到AjaxControlToolkit.dll;或者安装AjaxControlExtender.vsi,然后到”我的文档\Visual Studio 2008\Templates\ProjectTemplates\Visual C#\“找AjaxControlExtenderProjectCS.zip,解压,也可以得到AjaxControlToolkit.dll。
2、下载ajaxcontroltoolkit-framework3.5.zip然后解压,用vs2008编译,在ajaxcontroltoolkit-framework3.5\AjaxControlToolkit\bin\Release中有AjaxControlToolkit.dll。