用户控件
用户控件是个什么东西?
自定义的反复重用的控件集合
好处?
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.Name
d.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)
{
List<FlowPath> temp = new List<FlowPath>();
Session["list"] = temp;
}
List<FlowPath> list = Session["list"] as List<FlowPath>;
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<FlowPath>;
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.
这样服务端就会自动转换成正确的路径出来。
如:
<img id="img1" runat="server" src="images/delete.png" />
注意加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>指定路径写一个函数 注意不是# 是=,如下
<script src="<%= ShowScriptPath() %>" ></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")