1.嵌套的的Repeater
有时候需要使用到嵌套的Repeater,内层的Repeater需要根据外层的Repeater的某个值来输出相应的内容,这时repeater绑定数据的顺序是先绑定外层的Repeater的第一项,然后绑定这第一项内的内层得Repeater,然后绑定外层的Repeater的第二项,然后绑定这第二项内的内层得Repeater...依次往下直到绑定完。
所以有时可以用Label等控件存储外层的Repeater的某个值,然后内层的Repeater根据该值来输出相应的内容。
如果用sqldatasource等数据源控件的话,有一个小地方需要注意,那就是内层的Repeater的数据源控件需要在外层的Repeater里面才能找到Label等控件,如下:
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%#Eval("LwID")%>' Visible="false"></asp:Label
<asp:Repeater ID="Repeater2" runat="server" DataSourceID="SqlDataSource2">
<ItemTemplate>
<div><%#Eval("RwCon")%></div>
</ItemTemplate>
</asp:Repeater>
<asp:SqlDataSource ID="SqlDataSource2" runat="server"
ConnectionString="<%$ ConnectionStrings:forumDBConnectionString %>"
SelectCommand="SELECT [RwCon], [LwID] FROM [replyword] WHERE ([LwID] = @LwID)">
<SelectParameters>
<asp:ControlParameter ControlID="Label1" Name="LwID" PropertyName="Text"
Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
</ItemTemplate>
</asp:Repeater>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:forumDBConnectionString %>"
SelectCommand="SELECT a.[LwID], a.[LwCon], a.[UserID], a.[UserIP],b.userNickName FROM [leaveword] a,userinfo b where a.userid=b.userid"></asp:SqlDataSource>
嵌套的的Repeater(非数据源控件的方式)
<asp:Repeater ID="rptPeopleTaskBB" runat="server" onitemdatabound="rptPeopleTaskBB_ItemDataBound">
<ItemTemplate>
<asp:Repeater ID="rptInnerPTB" runat="server">
<HeaderTemplate>
<table cellpadding="5px;" rules="all" style="width:100%; border:solid 1px black; text-align:center;">
<tr><th>序号</th><th>任务名称</th><th>计划开始时间</th><th>计划结束时间</th><th>计划工期</th></tr>
</HeaderTemplate>
<ItemTemplate>
<%count2 = count2 + 1;%>
<tr><td><%=count2%></td>
<td style="text-align:left;"><%#Eval("rwmc")%></td>
<td><%#Eval("karq","{0:yyyy年MM月dd日}")%></td>
<td><%#Eval("wcrq","{0:yyyy年MM月dd日}")%></td>
<td><%#Eval("rwgq")%> 工作日</td></tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
<%count2 =0;%>
</ItemTemplate>
</asp:Repeater>
protected void Page_Load(object sender, EventArgs e)
{
DataTable dtRYRWFGBB = tmd.GetJHRWFPRByXmid("090837043_115716625");
rptPeopleTaskBB.DataSource = dtRYRWFGBB;
rptPeopleTaskBB.DataBind();
}
protected void rptPeopleTaskBB_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
string strfpr=((Label)e.Item.FindControl("lblRWZXR")).Text;
((Repeater)e.Item.FindControl("rptInnerPTB")).DataSource = tmd.GetJHRWByFprandXmid(strfpr, "090837043_115716625_");
((Repeater)e.Item.FindControl("rptInnerPTB")).DataBind();
}
2.在Repeater中操作其内的控件
我们经常有这样的需求,在Repeater中出发某个控件的事件,然后在该事件中操作其他控件,如下:
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1">
<ItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Width="250"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="确定" οnclick="Button1_Click" />
</ItemTemplate>
</asp:Repeater>
protected void Button1_Click(object sender, EventArgs e)
{
Label2.Text =((TextBox)((Button)sender).Parent.FindControl("TextBox1")).Text;
}
这时我们可以试验一下这些Parent到底是什么:
Label2.Text = ((Button)sender).Parent.GetType().ToString();
System.Web.UI.WebControls.RepeaterItem 就是<ItemTemplate> (看来这里设置成了控件 而不是属性)
Label2.Text = ((Button)sender).Parent.Parent.GetType().ToString();
System.Web.UI.WebControls.Repeater 就是Repeater控件
3.客户端验证是为了用户体验,但不安全,因为用浏览器用户工具等这些东西可以修改无论是CSS样式,还是JS代码,所以为了安全还是采用服务器端验证。所以CSS就不说了,js操作元素什么的,最好只操作显示的元素,对于与服务器交互的元素,甚至是要写入数据库的,最好不要用js。
http://www.oschina.net/question/141209_20886?sort=default&p=1#answers
4.sql语句中日期时间格式化查询
不能用like '%2010-2-8%' 会被检查出无法转换为日期型
http://blog.sina.com.cn/s/blog_59cea87f0100eiv3.html
5.Sql常用语句 http://www.cnblogs.com/fan0136/archive/2009/09/21/1571233.html
6.数据库分页语句 http://www.cnblogs.com/morningwang/archive/2009/01/02/1367277.html
http://niunan.iteye.com/blog/264197
7.jQuery防止ajax缓存 http://youfengkai.iteye.com/blog/721252
<script type="text/javascript" language="javascript">
$.ajaxSetup ({
cache: false //close AJAX cache
});
</script>
8.数据库索引 http://www.cnblogs.com/KissKnife/archive/2009/03/30/1425534.html
http://blog.csdn.net/ant_yan/article/details/2932068
http://baike.baidu.com/view/2079871.htm
9.数据库设计规范 http://www.cnblogs.com/JimmyZhang/archive/2007/08/30/875504.html
10.数据库视图 http://www.cnblogs.com/fineboy/archive/2005/09/14/236731.html
http://baike.baidu.com/view/71981.htm
当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化,同时,若基本表的数据发生变化,则 这种变化也可以自动地反映到视图中。
11.数据库ISNULL和IS NULL http://www.cnblogs.com/waxdoll/archive/2009/11/20/is_null_isnull.html
http://www.w3school.com.cn/sql/sql_isnull.asp
12.数据库CAST和CONVERT http://blog.sina.com.cn/s/blog_59cea87f0100eiv3.html
13.TreeView分级递归绑定
以下方法跟数据库设计有很大关系,如表里有节点ID jdid 父节点ID fjdid 所以不是通用方法
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
TreeNode node = new TreeNode("根节点名称");
node.Value = 获取根节点ID;
node.ImageUrl = "images/tree_folder.gif";
makeTree(获取所有数据的DataTable, node);
TreeView1.ExpandDepth = 1; 展开的深度很重要,因为我们定义了TreeView1_TreeNodeExpanded方法,只要深度在ExpandDepth内的节点,在展开时(这里是绑定时就展开了)都会触发该事件,所以如果默认是都展开的,那样的效果跟不分级递归绑定是一样的,效率很慢,也很费服务器资源
TreeView1.Nodes.Add(node);
}
}
protected void makeTree(DataTable dt, TreeNode tn)
{
DataView dv = dt.DefaultView;
dv.RowFilter = "fjdid='" + tn.Value+ "'"; dv.RowFilter选出所有父节点ID是 tn.Value的数据
try
{
foreach (DataRowView drv in dv)
{
TreeNode node = new TreeNode(drv["jdmc"].ToString());
node.Value = drv["jdid"].ToString();
node.ImageUrl = "images/tree_folder.gif";
tn.ChildNodes.Add(node);
makeTreeChild(dt, node);
}
}
catch (StackOverflowException ex)
{
Response.Write("栈溢出了:"+ex.Message);
}
}
protected void makeTreeChild(DataTable dt, TreeNode tn) 这里是分级递归到根节点的子节点的子节点,可以自己再加一个类似的方法实现更多级的递归
{
DataView dv = dt.DefaultView;
dv.RowFilter = "fjdid='" + tn.Value + "'";
try
{
foreach (DataRowView drv in dv)
{
TreeNode node = new TreeNode(drv["jdmc"].ToString());
node.Value = drv["jdid"].ToString();
node.ImageUrl = "images/tree_folder.gif";
tn.ChildNodes.Add(node);
}
}
catch (StackOverflowException ex)
{
Response.Write("栈溢出了:" + ex.Message);
}
}
protected void TreeView1_TreeNodeExpanded(object sender, TreeNodeEventArgs e)
{ 由于前面递归只绑定到根节点的子节点的子节点,所以当展开某节点时还需分级递归绑定出当前展开节点的子节点的子节点
if (e.Node.Depth >= 1) 根节点Depth是0
{ 由于前面有一部分节点已经绑定了,所以在再次分级递归绑定之前需要清除掉当前节点的子节点
e.Node.ChildNodes.Clear();
makeTree(new yg_bz_zysManager().getNodeByFjdid("").Tables[0], e.Node);
}
}
public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { DataTable dt = new TreeDatatableManager().GetNodeInfoByFjdid("0"); TreeNode rootnode = new TreeNode(dt.Rows[0]["jdmc"].ToString(), dt.Rows[0]["jdid"].ToString(), "images/tree_folder.gif"); MakeTreeDeepOne(new TreeDatatableManager().GetAllNodeInfo(), rootnode); trvwJdmc.ExpandDepth = 1; trvwJdmc.Nodes.Add(rootnode); } } protected void MakeTreeDeepOne(DataTable dt, TreeNode rootnode) { DataView dvw = dt.DefaultView; dvw.RowFilter = "fjdid='" + rootnode.Value + "'"; foreach (DataRowView drv in dvw) { TreeNode childnode = new TreeNode(drv["jdmc"].ToString(), drv["jdid"].ToString(), "images/tree_folder.gif"); rootnode.ChildNodes.Add(childnode); MakeTreeDeepSecond(dt, childnode); } } protected void MakeTreeDeepSecond(DataTable dt, TreeNode node) { DataView dvw = dt.DefaultView; dvw.RowFilter = "fjdid='" + node.Value + "'"; foreach (DataRowView drv in dvw) { TreeNode childnode = new TreeNode(drv["jdmc"].ToString(), drv["jdid"].ToString(), "images/tree_folder.gif"); node.ChildNodes.Add(childnode); MakeTreeDeepThird(dt, childnode); } } protected void MakeTreeDeepThird(DataTable dt, TreeNode node) { DataView dvw = dt.DefaultView; dvw.RowFilter = "fjdid='" + node.Value + "'"; foreach (DataRowView drv in dvw) { TreeNode childnode = new TreeNode(drv["jdmc"].ToString(), drv["jdid"].ToString(), "images/tree_folder.gif"); node.ChildNodes.Add(childnode); } } protected void trvwJdmc_TreeNodeExpanded(object sender, TreeNodeEventArgs e) { e.Node.ChildNodes.Clear(); MakeTreeDeepOne(new TreeDatatableManager().GetAllNodeInfo(), e.Node); } }