.net用户控件

用户控件
用户控件是个什么东西?
自定义的反复重用的控件集合

好处?
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;
    }

效果如图:

.net用户控件

2.事先在用户控件中定义public属性,通过属性为里面的控件赋值或取值。
用户控件中的代码:

.net用户控件
   public string TextValue
    {
        get 
        {
            return TextBox1.Text;
        }
        set
        {
            TextBox1.Text = value;//设置文本框里面的值
        }
    }
.net用户控件

 写好属性之后会在设计界面用户控件属性的杂项中出现该属性名,如下图

.net用户控件


页面中的代码:

同方法一:在按钮上添加click事件

   protected void Button1_Click(object sender, EventArgs e)
    {
        WebUC1.TextValue = Label2.Text;
    }

效果如图:

.net用户控件

(二)从用户控件向页面交换信息。代码要写用户控件。

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)不能删

.net用户控件
    protected override void OnLoadComplete(EventArgs e)
    {
        base.OnLoadComplete(e);
        if (Session["text"]!=null)
        {
            Label3.Text = Session["text"].ToString();
        }
       
    }
.net用户控件

效果如图:

.net用户控件

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事件

.net用户控件
    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 = "请选择要加载的节点";
        }  
  }
.net用户控件

 给代理写所需要绑定的方法(可以是在另一个用户控件上--谁需要这个方法在谁上面写)

.net用户控件
    public void ShowSession()
    {
        if (Session["list"]!=null)
        {
            Repeater1.DataSource = Session["list"] as List<FlowPath>;
            Repeater1.DataBind();
        }
    }
.net用户控件

给代理绑定方法--写在加载的页面上load里面,注意不要写在if(!IsPostBack中)因为每次加载都需要绑定

绑定使用方法同属性如:

UserList1.Show(show代理) = new UserList.ShowDeletgate(NodesShow1.ShowSession--这个ShowSession是个方法但是不加小括号)
.net用户控件
 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);//注意这里绑定方法的时候是 方法名 不带小括号
    }
.net用户控件

二.路径:

1.控件路径:图片、超链接

使用服务端的控件。标准控件或者HTML标记加上runat=server.

这样服务端就会自动转换成正确的路径出来。

如:

<img  />

注意加runat="sever"必须加上

2.样式表中值的路径:background-image:url(路径)

不要使用内联样式,使用外部样式表来控制图片路径。

首先在解决方案下添加外部样式表

.net用户控件

代码如下:

.dd {
    background-image:url(../images/h.png);
}

注意路径必须正确:确保从样式表可以找到对应的路径

然后,给需要加样式表的标签一个class="dd"名(这里用的.dd给class 也可以给加样式表改为#dd)

最后在需要使用的页面把样式表拖到,源页面的<head></head>中

.net用户控件

3.外部资源路径 - 用户控件中引入外部脚本文件
使用 string path = ResoveClientUrl("服务器端路径"); //返回的是客户端对应的路径

首先在用户控件上加<script></script>指定路径写一个函数 注意不是# 是=,如下

<script src="<%= ShowScriptPath() %>" ></script>

然后在解决方案下添加外部脚本

.net用户控件

脚本代码:

alert("这是外部脚本文件的内容")

最后在cs代码界面添加对应的方法

    public string ShowScriptPath()
    {
        string path = "Scripts/JavaScript.js";//外部样式表存放路径
        path = this.ResolveClientUrl(path);//重新解析为可识别的路径
        return path;
    }

4.C#代码的调用路径
Response.Redirect("页面");
使用应用程序路径的根来解决

在路径前面加上一个 ~ 符号--从跟目录开始寻找
Response.Redirect("~/Default.aspx")