一:关于数据库
(1) 数据库表中有"公司类型"字段,可以设计成int,这样如果直接select出后与DataTable绑定的话,想把对应的int值换成对应的用户理解的文本,赋值就出现不匹配问题,因为DataTable里面那一列是int型.
所以可以在数据库中就改为nvarchar(),这样DataTable中对应的列也就是string了.
(2) ms sql server 中存储过程, declare @thisGeneratedId int 然后你 set @thisGeneratedId= (select ...),当没有找到时,@thisGeneratedId成了null,后文你要根据它办事的话就要 if @thisGeneratedId is null ......我还以为没有就是0,哎!我错了!看来那些工程师想问题确实专业:=0和is null是完全不一样的!
(3)T-SQL中,局部临时表与全局临时表:局部临时表(#开头)只对当前连接有效,当前连接断开时自动删除;全局临时表(##开头)对其它连接也有效,在当前连接和其他访问过它的连接都断开时自动删除。
临时变量:DECLARE @local_variable data_type;全局变量以两个at(@)开头,全局变量是系统预定义的,返回一些系统信息
二:关于页面传参
写了分页的,在页面参数这里纠结了一会尔,主要是不太懂事件的执行顺序.
事件执行简单顺序为:先执行page_load()事件,再执行比如按钮点击事件,这个可以分别在每个事件里面写Response.Write(),这样就能大概看到了.
回归正题,当涉及到用户自定义控件就麻烦了,因为自定义控件也有page_load()这样的事件.我是这样解决的:把跟数据库打交道的每个字段都当做页面的参数,在UerControl里面定义这几个字段的默认值并赋值,并且尽量不让自定义控件PostBack,即page_load()里面只有!IsPostback,这样简单多了.page_load()里直接获得参数并给相应默认值赋值,访问时,刚开始没有参数,则连接数据库的字段是默认值;当分页即有参数时则用参数.并且在按钮点击事件里面直接Redirect到指定参数的页面.这样做的目的是访问此页不管是第一次访问还是上下页都保证了是第一次访问,即不是PostBack.
三:JS及后台控制div的显示与否
默认让一个div不显示:
<!-- 默认是不显示这个格子的 --> <div id="cellTextBox" style="display:none"> 中/大型团体名:<asp:TextBox ID="txtGroupName" runat="server" ></asp:TextBox> </div>
然后一个dropdownlist的切换导致显示/不显示的切换,给它一个onchang事件,调用JS
<td> 招聘会类型: <asp:DropDownList ID="ddlRecruitType" runat="server" Width="85px" onchange="JavaScript:ShowOrBlock(this)" > </asp:DropDownList> </td>
JS代码如下:
<!-- 控制中/大型团体名的javascript --> <script type="text/javascript"> <!-- javascript 控制那个小框的显示与否,注意这里把dropdownlist传进来了,还要注意下标从0开始的 --> function ShowOrBlock(ddl) { if (ddl.selectedIndex == 0) { document.getElementById("cellTextBox").style.display = "none"; } else { document.getElementById("cellTextBox").style.display = "block"; } } </script>
上面单纯是前台之间的操作,但用到了后台也要根据一些情况控制div的显示与否,如下控制:
/*下面在这里控制组团的框显示与不显示*/ int ddlSelectedValue = ddlRecruitType.SelectedIndex; if (ddlSelectedValue==1||ddlSelectedValue==2) //因为默认都是不显示,所以只要把要显示的情况显示就好了 { Page.RegisterStartupScript("cellTextBox", "<script>ShowOrBlock(1)</script>"); }
这里用到了一个什么注册,里面第一个string貌似无关痛痒,第一个参数必须是<script>的脚步字符串,这里传进去了一个"1"也行,不太清楚,大概意义就是讲无效,调用了JS里面else的处理,而这个恰好就是不显示
四:自定义Repeater控件的删除与修改
下面是自定义repeater,显示一个表格,用存储过程读取数据库, onitemcommand="Repeater1_ItemCommand" 自定义了repeater里面每一个项的命令的事件,你可以自己写相关操作.
<table cellpadding="5"> <tr id="trTop"> <td >编号</td> <td >学院</td> <td>专业</td> <td>本</td> <td>硕</td> <td>博</td> <td>删除</td> <td>修改</td> </tr> <asp:Repeater ID="Repeater1" runat="server" onitemcommand="Repeater1_ItemCommand"> <ItemTemplate> <tr> <td><%#Eval("id") %></td> <td><%#Eval("instituteName") %></td> <td><%#Eval("majorName") %></td> <td><%#Eval("undergraduateNum") %></td> <td><%#Eval("masterNum") %></td> <td><%#Eval("doctorNum") %></td> <td> <asp:LinkButton ID="lbtDelete" runat="server" CommandArgument='<%#Eval("id") %>' CommandName="delete" OnClientClick="javascript:return confirm('你确认要删除吗?')" >删除 </asp:LinkButton> </td> <td> <asp:LinkButton ID="lbtUpdate" runat="server" CommandArgument='<%#Eval("id") %>' CommandName="update" OnClientClick="javascript:myUpdate()" >修改 </asp:LinkButton> </td> </tr> </ItemTemplate> </asp:Repeater> </table>
后台代码如下:
/*repeater中多个点击事件*/ protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e) { int thisId = Convert.ToInt32(e.CommandArgument); //对应数据库demand表中id,表示这一列的 int myCompanyId = -1; //这一行的公司的id,即这个页面的参数 if (Request.QueryString["companyId"] != null) //再显示一次,而这里要获得公司id { myCompanyId = Convert.ToInt32(Request.QueryString["companyId"]); } /*下面是事件处理*/ if (e.CommandName.Equals("delete")) //如果点击了删除,并在前台确认删除了 { deleteById(thisId); //先删除,这里的id为demand表中的标识列 if (myCompanyId!=-1) //再显示一次,而这里要获得公司id { /*干脆转到这个页面,页面回发导致的不好的地方*/ Response.Redirect("AlterCompany.aspx?companyId=" + myCompanyId.ToString()); } } else if (e.CommandName.Equals("update")) //点击了修改按钮 { /*这里有必要说明一下: * 点击"修改"->弹出输入框(这个过程是在浏览器端执行JS的,并没有回发 * ->点击对话框的"确定"或"取消")(这里导致页面刷新了,因为linkbutton是服务器控件, 对话框点击"取消"则隐藏域的值是string的"",否则则为输入的) *所以后台根据是不是空不能判断是点击"取消"了,还是点击"确定"但没有输入值*/ string thisStrValue = Convert.ToString(Request.Form["hidText"]); //注意request的使用 if (thisStrValue!="") //为空就没有什么操作,只是回传一下 { /*先对string里面的值进行处理,得到三个数字*/ int ben=-1, shuo=-1, bo=-1; string [] arr=Regex.Split(thisStrValue,@"s+"); //正则表达式,按空格分开 try { ben = Convert.ToInt32(arr[0]); //这里转换失败也会抛出异常 shuo = Convert.ToInt32(arr[1]); bo = Convert.ToInt32(arr[2]); if ((arr.Length != 3)||(ben<0)||(shuo<0)||(bo<0)) //错误输入 { throw new Exception(); } else { updateById(thisId, ben, shuo, bo); //更新 Response.Redirect("AlterCompany.aspx?companyId=" + myCompanyId.ToString()); } } catch (System.Exception ex) { Response.Write("<script language=javascript>alert('请输入三个非负整数,并用空格隔开!')</script>"); } } } }
(1)说说删除
CommandArgument='<%#Eval("id") %>' 匹配数据库读取出的行标识,唯一的,可以定义这一行,然后根据这个标识操作此行
CommandName="delete" 标识对repeater此行操作的名字,删除啊,更新啊什么的
OnClientClick="javascript:return confirm('你确认要删除吗?')" 客户端点击事件,这里是个JS,弹出是不是确定要操作,如果用户点击确定按钮,则 confirm() 返回 true。如果 点击取消按钮,则 confirm() 返回 false。可以看到返回false就不会导致页面回发的,只有true才会,代码:
点击 "删除",如上代码,会看到可以得到这个操作的操作名"delete"和这一行的标志"e.CommandArgument",对应上面的俩个参数,自己写一些操作数据库的函数,存储过程之类
(2)说说修改
修改我不愿意跳转到另一个页面,所以用JS弹出输入框的方式获取输入,然后.cs页面获取,再操作.
这里就有几个问题:
1)JS弹出框,把获得的输入值放到一个地方:
<!-- 下面是修改点击时弹出对话框获得输入 --> <script type="text/javascript"> function myUpdate() { var myText = prompt("请输入当前 本 硕 博 人数,用空格隔开:"); document.getElementById("hidText").value = myText; //把输入的结果放到隐藏域里面 } </script>
prompt()弹出一个框,若点击了 "取消"则值为空,否则就是输入的(但输入也可能为空)
2)这个地方为:
<!-- 这个隐藏的装弹出框输入的值,可以从后台得到这个值,且这个值在被JS改变后服务器端也知道其改变 --> <input type="hidden" name="hidText" id="hidText"/>
这里装的就是输入值
3)后台获取:
/*这里有必要说明一下: * 点击"修改"->弹出输入框(这个过程是在浏览器端执行JS的,并没有回发 * ->点击对话框的"确定"或"取消")(这里导致页面刷新了,因为linkbutton是服务器控件, 对话框点击"取消"则隐藏域的值是string的"",否则则为输入的) *所以后台根据是不是空不能判断是点击"取消"了,还是点击"确定"但没有输入值*/ string thisStrValue = Convert.ToString(Request.Form["hidText"]); //注意request的使用
即从Request类的窗体中的一个获得
这里注意一个问题: 后台.cs页面怎么获得已经发给浏览器端的控制的值,而且还不是服务器控件(JS仅仅在浏览器端执行,改变的也只是浏览器端控件的值,这个还要在页面不回传才看到效果)http://bbs.csdn.net/topics/240045129