5).pagelet控件
自己做控件最简单的方法就是pagelet控件,后缀为.aspc,用register指令包含到webform中:
<%@ register tagprefix="acme" tagname="message" src="pagelet1.aspc" %>
tagprefix是pagelet的名称空间定义,tagname是给pagelet取的名字。src属性是虚拟目录。
pagelet的使用:
<acme:message runat="server"/>
。暴露pagelet的方法,像一个类一样定义属性,例:
<script language="c#" runat="server">
public string address{
get{
return txtaddress.value;
}
set{
txtaddress.value=value;
}
}
</script>
<input id="txtaddress" runat="server">
。封装事件
略
可以看出,pagelet可以取代include文件的作用。
。编程创建pagelet对象
可以用程序生成pagelet控件的实例,如:
control cl=loadcontrol("pagelet2.aspc");
((pagelet2_aspc)cl).category="business";
page.controls.add(cl);
注意,因为loadcontrol函数返回一个system.web.ui.control对象,因此需要造型。pagelet
的类型为文件名,点号换成下划线。
6).数据帮定控件
asp+中,不仅可以帮定到数据库,还可以帮定到简单的属性集合,甚至方法调用的结果,如:
customerid: <%# custid %>
<asp:listbox id="list1" datasource=<%# myarray %> runat="server">
<%# (customer.firstname + customer.lastname)%>
<%# getbalance(custid) %>
看起来跟asp中的<%=%>一样,但是asp是用response.write来替换的,而asp+则是在databind()
方法调用后才帮定的。数据帮定控件和page对象都有databind()方法。
注意,asp+是强类型的,所以:
<%# count.tostring() %>才对。
。databinder.eval()
一个静态方法,由asp+支持,允许后帮定的数据帮定表达式,而且还可选地转化为串,可以
用于模板。如不用eval,则像:
<%# string.format("{0:c}",((datarowview)container.dataitem)["someinteger"]) %>
可以用eval:
<%# databinder.eval(container.dataitem,"someinteger","{0:c}") %>
7).服务器方数据访问
。连接、命令和数据集(datasets)
ngws提供了一系列受管数据访问api,引入名称空间:
<%@ import namespace="system.data" %>
<%@ import namespace="system.data.sql" %>
a).生成sqlconnection
b).构造sqldatasetcommand
c).filldataset
如果是插入等操作,则用sqlcommand替换sqldatasetcommand.
记住:始终在用完连接后关闭连接!否则要等到页面被释放时才会被垃圾回收机制释放资源。
。帮定数据到datagrid,例:
….
dataset ds = new dataset();
mycommand.filldataset(ds,"authors");
mydatagrid.datasource = ds.tables["authors"].defaultview;
mydatagrid.databind();
。参数化查询
sqldatasetcommand支持参数,"@"作为参数前缀,例:
mycommand.selectcommand.parameters.add(new sqlparameter("@state",sqldatatype.varchar,2));
mycommand.selectcommand.parameters["@state"].value=newvalue;
注意,如果datagrid要在客户与服务器间轮转的话,一定要把maintainstate属性设置为false,
否则,性能受到影响,如:
<asp:datagrid id="mydatagrid" runat="server"
maintainstate="false"/>
。插入数据
应当保证不为null,可以使用try/catch块。
例:
string insertcmd = "insert into authors values(@id,@lname)"
sqlcommand myc = new sqlcommand(insertcmd,myconn);
myc.parameters["@id"].value=cu_id.value;
myc.parameters["@lname"].value=au_lname.value;
myc.activeconnection.open();
try{
myc.execute();
}catch(sqlexception e){
if (e.number==2627)
……//主键重复
}
myc.activeconnection.close();
。更新记录
datagrid提供了一些内在支持,有一个整型属性,edititemindex,表示哪一行可以编辑,一但设置,
该行的文本输入框显示,而不是却省的静态文本,如为-1则表示没有行可以编辑。
datagrid可以包含一个控件,editcommandcolumn,它将为datagrid引发三个事件,editcommand,
updatecommand,和cancelcommand。editcommandcolumn在属性中用columns定义,如:
<asp:datagrid id="mydatagrid" runat="server"
……
oneditcommand="mydatagrid_edit"
oncancelcommand="mydatagrid_cancel"
onupdatecommand="mydatagrid_update"
datakeyfield="au_id"
>
<property name="columns">
<asp:editcommandcolumns edittext="编辑" canceltext="取消" updatetext="更新"/>
</property>
</asp:datagrid>
edit事件中参数datagridcommandeventargs参数包含了用户选择的行,然后我们可以重新帮定,
以刷新显示。例:
public void mydatagrid_edit(object sender,datagridcommandeventargs e){
mydatagrid.edititemindex = (int)e.item.itemindex;
bindgrid();//调用另外的函数实现重新帮定
}
在cancel事件中,我们只需要把edititemindex设为-1就可以了。
在update事件中,我们需要更新数据。要知道当前行的主键值,这可以用刚才设的datakeyfield
来获得,我们可以获得行的主键值,如:
mycommand.parameters["@id"].value=mydatagrid.datakeys[(int)e.item.itemindex];
最后将edititemindex设为-1。
为了防止用户修改主键,可以单独定义一行中各列的表现,将其改为只读,如:
<asp:datagrid id="mydatagrid" runat="server"
……
datakeyfield="au_id"
autogeneratecolumns="false"
>
<property name="columns">
<asp:editcommandcolumn edittext="编辑" cancletext="取消" updatetext="更新"/>
<asp:boundcolumn headertext="au_id" sortfield="au_id" readonly="true" datafield="au_id"/>
<asp:boundcolumn headertext="电话" sortfield="phone" datafield="phone"/>
……
</property>
</asp:datagrid>
。删除记录
加一个buttoncolumn控件,command设为"delete",将引发deletecommand事件。
。排序
当用户点一列的header时,如果datagrid的allowsorting属性为true,则一个onsortcommand
事件产生,参数datagridsortcommandeventargs的sortfield传回来的是哪一个列被选中,如:
protected void mydatagrid_sort(object src,datagridsortcommandeventargs e){
dataview source=ds.tables["authors"].defautlview;
source.sort=e.sortfield;
mydatagrid.databind();
}
。表间关系
用一列做个连接,跳转到另一页去查看对应的详细资料,用控件hyperlinkcolumn,如:
<property name="columns">
<asp:hyperlinkcolunn
datanavigateurlfield="au_id"
datanavigateurlformatstring="a.aspx?id={0}"
text="详细情况"
/>
</property>
。访问基于xml的数据
dataset有一个方法叫readxml,用filestream作为参数,xml文件的格式为:
<documentelement>
<tablename>
<columnname1>comumn value</colunname1>
……
</tablename>
</documentelement>
每一个<tablename>段代表一行数据。
例:
dataset ds = new dataset();
filestream fs = new filestream(server.mappath("a.xml"),filemode.open,fileaccess.read);
streamreader reader = new streamreader(fs);
ds.readxml(reader);
dataview source = new dataview(ds.tables[0]);
myspan.innerhtml = source.table.tablename;
mydatagrid.datasource = source;
mydatagrid.databind();
还可以分别调用readxmlschema和readxmldata分开读取模式和数据。
