• .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;
        }

    效果如图:

    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")

  • 相关阅读:
    笔记本连接蓝牙音箱声音异常
    fence安装中遇到的问题
    ssm整合关键
    第二章:数字系统
    第一章:计算器系统体系结构
    第二章:变量和基本类型
    第一章:开始
    第十九章:特殊工具与技术
    第十八章: 用于大型程序的工具
    第十七章:标准库特殊设施
  • 原文地址:https://www.cnblogs.com/liujiangping/p/4759051.html
Copyright © 2020-2023  润新知