用户控件
用户控件是个什么东西?自定义的反复重用的控件集合好处?
1.代码重用2.结构良好3.分工开发4.局部缓存难点:
一.交换信息:注意信息的交换只在相邻层之间进行交换,如果是嵌套交换信息除Session外都需要一层一层的写代码交互
(一)从页面向用户控件交换信息。代码写在页面中。
1.用户控件名.FindControl("用户控件中的控件的ID")
TextBox textBox1 = WUC1.FindControl("TextBox1") as TextBox;
暴力转换:尽量少用
案例:添加按钮click属性,点击后往用户控件中传信息
protected void btn_Click(object sender, EventArgs e) { string s = Label1.Text; TextBox textbox1 = WebUC1.FindControl("TextBox1") as TextBox; textbox1.Text = s; }
效果如图:
2.事先在用户控件中定义public属性,通过属性为里面的控件赋值或取值。
用户控件中的代码:public string TextValue { get { return TextBox1.Text; } set { TextBox1.Text = value;//设置文本框里面的值 } }
写好属性之后会在设计界面用户控件属性的杂项中出现该属性名,如下图
页面中的代码:同方法一:在按钮上添加click事件
protected void Button1_Click(object sender, EventArgs e) { WebUC1.TextValue = Label2.Text; }
效果如图:
(二)从用户控件向页面交换信息。代码要写用户控件。
1.session
第一步:在用户控件的按钮中把数据放在Session中。给button加click事件
protected void Button1_Click(object sender, EventArgs e) { Session["text"] = TextBox1.Text; }
第二步:在页面的OnLoadComplete事件中,从Session中取出数据来,显示在页面上。
在页面中重写override函数 onloadComplete
这样在页面加载完成后执行下面的方法,判断Session["text"]中如果没有信息就什么也不执行,注意第一行 base.OnLoadComplete(e)不能删
protected override void OnLoadComplete(EventArgs e) { base.OnLoadComplete(e); if (Session["text"]!=null) { Label3.Text = Session["text"].ToString(); } }
效果如图:
2.代理、委托 delegate
指向方法(动作)的引用。 Dog d = new Dog();
类比:类的使用 - 指向对象的引用类的使用步骤:第一步:用class 关键字定义一个类的类型public class Dog{ //成员变量定义//成员属性定义//成员方法定义}第二步:使用这个新的类型定义一个变量(类的变量)引用。Dog d;第三步:把这个变量引用指向一个新对象。
d = new Dog();第四步:通过调用引用,实现对对象的调用。
d.Named.Bark()代理的使用步骤:
第一步: 使用 delegate 定义一个新的代理类型。public delegate 返回类型 代理类型名( 参数定义);例如:public delegate void ShowDelegate(string s);第二步:使用新的代理类型定义一个变量(代理变量)ShowDelegate Show;第三步:把代理变量指向一个新的方法Show = new ShowDelegate(方法名);第四步:通过调用代理来实现对方法的调用。Show("hello");案例:从一个用户控件中向另一个用户控件加添加节点
定义一个delegate代理ShowDelegate,然后生命一个代理实例化
public delegate void ShowDeletgate();//定义代理 public ShowDeletgate Show;//实例化
给button写click事件
protected void btnAddNode_Click(object sender, EventArgs e) { if (Session["list"] == null) { Listtemp = new List (); Session["list"] = temp; } List list = Session["list"] as List ; list = list.OrderBy(p => p.Orders).ToList(); int order = 1; if (list.Count>0) { order = list.Last().Orders.Value+1; } FlowPath data = new FlowPath(); if (Request["rbnode"] != null)//判断是否选择了radio { data.Code = DateTime.Now.ToString("yyyyMMddhhmmss") + order + Session["uid"].ToString(); data.EmpId = Request["rbnode"].ToString(); data.Orders = order; list.Add(data); Session["list"] = list; if (Show != null)//调用代理,代理名不加括号 { Show();//使用代理--类似于使用方法 } } else { Label1.Text = "请选择要加载的节点"; } }
给代理写所需要绑定的方法(可以是在另一个用户控件上--谁需要这个方法在谁上面写)
public void ShowSession() { if (Session["list"]!=null) { Repeater1.DataSource = Session["list"] as List; Repeater1.DataBind(); } }
给代理绑定方法--写在加载的页面上load里面,注意不要写在if(!IsPostBack中)因为每次加载都需要绑定
绑定使用方法同属性如:
UserList1.Show(show代理) = new UserList.ShowDeletgate(NodesShow1.ShowSession--这个ShowSession是个方法但是不加小括号)
protected void Page_Load(object sender, EventArgs e) { if (Session["uid"] == null) { Response.Redirect("login.aspx"); } if (!IsPostBack) { } UserList1.Show = new UserList.ShowDeletgate(NodesShow1.ShowSession);//注意这里绑定方法的时候是 方法名 不带小括号 }
二.路径:
1.控件路径:图片、超链接
使用服务端的控件。标准控件或者HTML标记加上runat=server.
这样服务端就会自动转换成正确的路径出来。
如:
注意加runat="sever"必须加上id=""
2.样式表中值的路径:background-image:url(路径)
不要使用内联样式,使用外部样式表来控制图片路径。
首先在解决方案下添加外部样式表
代码如下:
.dd { background-image:url(../images/h.png);}
注意路径必须正确:确保从样式表可以找到对应的路径
然后,给需要加样式表的标签一个class="dd"名(这里用的.dd给class 也可以给加id="dd"样式表改为#dd)
最后在需要使用的页面把样式表拖到,源页面的<head></head>中
3.外部资源路径 - 用户控件中引入外部脚本文件
使用 string path = ResoveClientUrl("服务器端路径"); //返回的是客户端对应的路径首先在用户控件上加<script></script>指定路径写一个函数 注意不是# 是=,如下
然后在解决方案下添加外部脚本
脚本代码:
alert("这是外部脚本文件的内容")
最后在cs代码界面添加对应的方法
public string ShowScriptPath() { string path = "Scripts/JavaScript.js";//外部样式表存放路径 path = this.ResolveClientUrl(path);//重新解析为可识别的路径 return path; }
4.C#代码的调用路径
Response.Redirect("页面");使用应用程序路径的根来解决在路径前面加上一个 ~ 符号--从跟目录开始寻找
Response.Redirect("~/Default.aspx")