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

时间: 2024-08-05 09:19:40

.net用户控件的相关文章

用户控件与页面间相互给各自的控件赋值

用户控件 ->页面 ((Label)this.Parent.Page.FindControl("AAA")).Text = "ABC"; AAA:页面控件ID Label:页面控件类型 页面 -> 用户控件 ((HiddenField)POPUSER_1.FindControl("hidNO")).Value = "VNBB"; POPUSER_1:用户控件ID HiddenField:用户控件中需要处理的控件的类

用户控件,动态创建添加用户控件

用户控件的制作步骤 1,新建一个项目,文件>新建>项目. 2,添加>新建项>用户控件.文件类型为.cs 使用用户控件 在用户控件设计业点击工具栏中的生成项,选择第一项生成解决方案,或直接点F6: 生成成功后在windows窗体的工具栏最顶端就会显示此用户控件 动态添加控件 输入一个值为n,点击按钮,动态生成n个按钮,并编号号 private void button1_Click(object sender, EventArgs e) { //先获取用户输入的是几 int count

WinForm用户控件、动态创建添加控件、timer控件--2016年12月12日

好文要顶 关注我 收藏该文 徐淳 关注 - 1 粉丝 - 3 0 0 用户控件: 通过布局将多个控件整合为一个控件,根据自己的需要进行修改,可对用户控件内的所有控件及控件属性进行修改使用 动态创建添加控件: 1 //定义控件类型 2 Button btn = new Button(); 3 //控件名称……等属性,也可以直接绑定各种事件 4 btn.Name = "mybutton" + i.ToString(); 5 //添加到窗体 this 可以替换为 容器控件 6 this.Co

无边框窗体和用户控件以及权限

无边框窗体: 就是吧窗体的边框去掉,然后自己做按钮设置功能. 无边框窗体的移动: 将下面代码直接复制粘贴,将窗体的鼠标按下事件的方法改成下面方法的名字就可以直接使用 1 //窗体移动API 2 [DllImport("user32.dll")] 3 public static extern bool ReleaseCapture(); 4 [DllImport("user32.dll")] 5 public static extern bool SendMessag

js清空web用户控件的值

假设你的用户控件里面有: <asp:DropDownList ID="DropDownList1" runat="server"> <asp:ListItem Text="111" Value="111"></asp:ListItem> </asp:DropDownList> 然后你在aspx页面中注册这个控件: <%@ Register Src="~/WebUs

用户控件(二)--常见4 种路径问题解决:

二.路径:1.问题: 添加到用户控件中的图片以及超链接 都会有固定的路径,当将用户控件用到其他页面中后,对应的页面路径需要发生变化,否则无法正常作用显示:解决: 在添加到用户控件中的 HTML 标记或者标准控件中添加:runat= server id=“id名”:这样服务端会根据使用情况自动更正图片或者超链接路径:注意: 超链接可以直接使用标准控件:Hyperlink 它里面直接带 runat=server: 2.问题?样式表中值的路径:(例)background-image:url(路径) 解

winfrom获取用户控件里的控件对象

如何获取用户控件里的控件对象呢,其实思路也是很简单的, 比如有一个panel 用户控件 里面有许多的其他控件. 那么要找出一个Label控件怎么找呢,好的.现在我们就开始 首先,一个foreach循环获得所有控件. 然后根据类型筛选出这个类型的所有控件.然后就可以用Name来判断了 foreach(var lb in mi_image1.Controls) {    if (lb is Label)    {         Label obj = lb as Label;   //如果把循环改

028.用户控件、生命周期

1.控件父类型ControlFindControl(寻找子控件)Controls 子控件集合 2.AutoPostBack 允许自动回发作用:允许控件向服务器端提交请求 3.生命周期:页面对象从创建到销毁的过程,也就是处理请求的过程.在Page_Load()中需要判断IsPostBack 4.错误处理页面级别:当前页面的错误全局:整个应用程序的错误配置文件:整个应用程序错误,不能捕获异常,只能转向. 5.用户控件(自定义的服务端控件)目的:重用界面元素及代码<%--注册用户控件,Src指向控件,

用户控件UserControl图片资源定位

MEF编程实现巧妙灵活松耦合组件化编程,一些细节需要花费不小心思去处理: 其中组件中若包含用户控件,且需要访问图片资源,那么需要做以下设置 1. 用户控件(usercontrol)所在工程目录下,创建图片目录,假设创建images文件夹,然后添加1.png图片 2. 设置1.png图片属性-->生成操作-->Resource 3. 创建一个目录Views,扔个用户控件a.xaml,拖放图片控件ImageBrush 4. 那么ImageBrush的图片资源属性应如下设置: <ImageBr

ios用户控件

22:48:452015-03-16说道用控件,很地东方都在用.用好了,可以加快开发进度,提高可维护性,程序的稳定,健壮性,用不好,也可以提高经验值啊,下次就好了,算是学习成本吧. 不同语言,不同项目个不相同. IOS中还是xib方式.用户控件.h 用户控件.m 用户控件.xib .相互配合.xib文件还UI部分,这个算是有个设计视图,可以直接看效果,减少代码量. .h 定义对外部分,.m具体实现.