上一篇我们介绍了使用ECO创建Weblog的基础工作,包括建立ECO类图与数据映射、自动生成代码、创建数据库结构、设置数据连接等内容。现在我们着手处理ASP.net页面的控件关联与操作。其实ECO是这么一个工具,它是基于Delphi的(因为架构师有Bold的历史),看起来也离不开建模工具,但对于建模工具来说并不一定要使用Together(就是BDS嵌入的那个UML工具),它还可以使用ModelMaker,Modelmaker有个相应的版本支持ECO建模,而且它是把所有的文件打成一个包的,比Together分散文件也许要好一些,同时模型的导入导出,代码的同步可能做得更加优秀,使用它之前要卸载BDS中的Together….我们说跑题了,这方面的内容我们以后再介绍
J
我们将使用Post类表示每一条blog日志,Comment表示每一条评论,Category表示每一个blog的分类。创建这个EcoAsp.net项目的时候,系统默认给我们一个Webform1.aspx的空页,我们在上面点击Rename,改名为Blogs.aspx然后存盘。
每个aspx页面带有一个后缀为cs的文件,它负责在运行中创建与aspx页面相同id标称的页面与自定义对象,Eco的基础类操作等内容都在上面进行。
在IDE上面,我们可以看见这几部分,一个是页面的控件放置区,一个是系统控件或不可见控件的托盘区,最下面是aspx页面的代码区(我较怀念TP1.0和DOS时代,所以使用了Twinlight的色彩模式。
中间那个rhroot是一个ECO的reference handle,我们暂时把它看成是页面所有的数据的集中来源,随后我们创建的用于过滤和查询的expressionhandle等控件都要指向它。
对于这些rhroot (roothandle) ,expressionhandle都需要好好理解,不能只从字面上、功能上去理解,还要从创作这些类的意图去理解,这样才不会用错,不要因为用错控件导致系统效率降低等问题,下面这两个图是从BDS的reference book中切出来的,大家见仁见智,回头有空再来书写有关handle的内容。
我们接着创建一个Category的aspx显示列表。 点击1,然后点击2,如果点错,ToolPalette就不会再现EnterpriseCoreObjects一类让你选择。
双击ExpressionHandle ,添加条件查询的控件.
此时ExpressionHandle添加到了rhRoot旁边
点击rhRoot,,然后我们在Object Inspector中可以看到下面的属性
请把rhRoot的Ecospacetype设置为ECOWeblogECOSpace,然后回车
点击Expresshandle1,请把RootHandle属性下拉并设置为rhRoot
好,现在存盘,编译
点击Expression属性的扩展选择窗口,这个扩展就是用来手动地设置对象的过滤等OCL操作,这个扩展选择窗口可以在运行时用代码唤起,而Expression也可以由我们在程序中自动修改。刚入门的朋友可以暂时理解它为SQL语句(有关OCL的内容请大家在我的Blog中查找资源)
这就是expression属性的扩展窗口,我刚把界面那个Classes的树展开了,我们可以看到有Category,comment,entry,post等类的列表。
我们双击Category,然后界面出现这样,同样,我把ocl operations操作列表也展开了。
可以看到,它可以使用更多的、对象化的"查询"条件。
然后双击.allInstances,表示进行一个select * from category的查询。返回所有的持久化了的对象条目。
可以看到Syntax is OK , 表示语法没问题,如果这些提示显示为红字,就是语法还没过关,虽然编译不出问题,但执行中会出异常。
接下去我们在页面中放入Datagrid控件。
选择自动套用格式,选择了专业1型
噢,忘了把expressionhandle1改名了,我们要把改为ehCategories,(eh表示expresshandle)
然后要把它的属性AddExternalId改为True,我们接下去在datagrid绑定中要用到。
在datagrid1上面点击右键,选择属性生成器,我们在属性生成器中编辑表格的宽度,列数,列名,表格的风格色彩等等
请选择数据源为ehCategories,数据键字段为ExternalId
接着我们选择“列”设置项,把可用列中的Name放置到选定列中去,这个Name是,类别(category)的名称。并且我们还要把页眉文本改为Categories。
注意把“在运行时自动创建列”的选择去掉,否则在表格显示的时候所有的隐含列都出来了.
点击确定之后,我们在设计页面中可以看到:
接着点击Button,把Web控件Button添加到设计页面中,用它来表示添加类条目功能,注意请先在Categories表格旁边先回车一下。不要让button控件贴着Datagrid,我们计划在右边放置blog的列表. 所以把所有的button都计划放在datagrid下方.
添加后的情况是这样:
真是
sorry,
我在书写的过程中把
Category
打成
Catetory
了
,
这个错误需要在
ECO
的类设计图中进行更名
(rename)
,
不要手动地在
Project Manager
中修改
,
以免
BDS
自动再生成代码
,
把原添加代码弄丢
.
那个
ehCategories
的
expression
字符串也要进行修改,把
Catetory
改为
Catogory
就ok, 然后重新进行编译和存盘
我们可以在
Model View
中点击
Regenerate ECO source code
,这个功能帮我们重写自动生成的代码,但它是不会覆盖已写的函数的,这个对我们进行后期更名等工作有用。
还有就是这个
EcospaceProvider
上面的
Evolve Schema
功能,在我们加入新的类和结构的时候可以用它进行数据库结构的“升级”。
在设计器中双击“新类别”按键,我们为这个按键添加事件处理,把新的类别行加入到表格中。
private void AddCategory_Click(object sender, System.EventArgs e)
{
Category NewCategory;
NewCategory=new Category(this.EcoSpace);
NewCategory.Name="新的类别";
this.EcoSpace.UpdateDatabase();
DataBind();
}
然后,再次点击Datagrid1的属性生成器,把按钮列中的编辑、更新、取消,删除列添加到选定的列中。
然后选择Datagrid1的事件页把CancelCommand,DeleteCommand,EditCommand,UpdateCommand分别和自动生成的几个事件函数相连。
在添加后我发觉EditCommand好象对不上号,所以修改了一下:
Private void DataGrid1_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
((DataGrid)source).EditItemIndex = e.Item.ItemIndex;
DataBind();
}
接着我们点可以点击运行了 :
第三部分正在书写中.......