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

好处?
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 = ;
if (list.Count>)
{
order = list.Last().Orders.Value+;
} 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="data: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")

.Net用户控件的更多相关文章

  1. C# 自定义控件VS用户控件

    1 自定义控件与用户控件区别 WinForm中, 用户控件(User Control):继承自 UserControl,主要用于开发 Container 控件,Container控件可以添加其他Con ...

  2. .net 用户控件ascx.cs注册js脚本代码无效果

    在.net web项目中碰到一个比较奇怪的问题,网上没找到解决方案,先自己mark一下 问题描述: 添加一个用户控件ascx,在后端.cs添加js注册脚本,执行后没有弹出框 注册脚本为: this.P ...

  3. winform 用户控件、 动态创建添加控件、timer控件、控件联动

    用户控件: 相当于自定义的一个panel 里面可以放各种其他控件,并可以在后台一下调用整个此自定义控件. 使用方法:在项目上右键.添加.用户控件,之后用户控件的编辑与普通容器控件类似.如果要在后台往窗 ...

  4. C#窗体程序【用户控件-窗体】委托事件

    这里的自定义控件是由普通控件组合而成的.希望事件响应代码推迟到使用自定义控件的窗体里写.步骤一:新建一个用户控件,放两个按钮,Tag分别是btn1,btn2.这两个按钮的共用单击事件处理代码如下: u ...

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

    好文要顶 关注我 收藏该文 徐淳 关注 - 1 粉丝 - 3       0 0     用户控件: 通过布局将多个控件整合为一个控件,根据自己的需要进行修改,可对用户控件内的所有控件及控件属性进行修 ...

  6. wpf的UserControl用户控件怎么添加到Window窗体中

    转载自 http://www.cnblogs.com/shuang121/archive/2013/01/09/2853591.html 我们来新建一个用户控件UserControl1.xaml &l ...

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

    如何获取用户控件里的控件对象呢,其实思路也是很简单的, 比如有一个panel 用户控件 里面有许多的其他控件. 那么要找出一个Label控件怎么找呢,好的.现在我们就开始 首先,一个foreach循环 ...

  8. winform用户控件、动态创建添加控件、timer控件、控件联动

    用户控件: 相当于自定义的一个panel 里面可以放各种其他控件,并可以在后台一下调用整个此自定义控件. 使用方法:在项目上右键.添加.用户控件,之后用户控件的编辑与普通容器控件类似.如果要在后台往窗 ...

  9. 039. asp.netWeb用户控件之七实现具有虚拟键盘的功能的用户控件

    用户控件ascx代码: <%@ Control Language="C#" AutoEventWireup="true" CodeFile="K ...

  10. WinForm用户自定义控件,在主窗体加载时出现闪烁;调用用户控件出现闪烁,需要鼠标才能够显示

    转载自:http://www.dotblogs.com.tw/rainmaker/archive/2012/02/22/69811.aspx 解决方案: 在调用用户控件的窗体里面添加一下代码: pro ...

随机推荐

  1. oracle 的索引

    一.索引分类      按逻辑分: 单列索引(Single column):  单列索引是基于单列所创建的索引 复合(多列)索引(Concatenated ): 复合索引是基于两列或者多列所创建的索引 ...

  2. struts2中的addActionError 、addFieldError、addActionMessage的方法

    一 addActionError ①概念addActionError是Action级别的错误消息 ②添加this.addActionError("错误信息"); ③显示<s: ...

  3. 夺命雷公狗---node.js---18之项目的构建在node+express+mongo的博客项目3头尾左侧分离法

    在实际的开发中我们的项目往往都是需要头尾分离开来的,居然是后台管理界面当然也不能错过这么好的这步.. 首先我们将我们要分离的部分代码先剪切出来,如下所示: 将他们都弄出来... 这部分的内容分别对应的 ...

  4. 使用javascript判断浏览器对css3的支持情况【译】

    Quick Tip: Detect CSS3 Support in Browsers with JavaScript Jeffrey Way on Nov 15th 2010  步骤 1 首先我们要确 ...

  5. django ORM model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct

    版权归作者所有,任何形式转载请联系作者.作者:petanne(来自豆瓣)来源:https://www.douban.com/note/301166150/ 1.多表连接查询:感觉django太NX了. ...

  6. linux设备驱动归纳总结(十):1.udev&misc【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-111839.html linux设备驱动归纳总结(十):1.udev&misc xxxxxxx ...

  7. wghd的git代码仓库分支管理说明【转】

    英文原文:http://www.nvie.com/posts/a-successful-git-branching-model/ 原文作者:Vincent Driessen 本文经Linux大棚博主总 ...

  8. Can't create/write to file '/tmp/#sql_887d_0.MYD' (Errcode: 17)

    lsof |grep "#sql_887d_0.MYD" 如果没有被占用就可以删掉 . https://wordpress.org/support/topic/cant-creat ...

  9. Hibernate,JPA注解@ManyToMany_JoinTable

    可以通过@ManyToMany注解可定义的多对多关联.同时,也需要通过注解@JoinTable描述关联表和关联条件.如果是双向关联,其中一段必须定义为owner,另一端必须定义为inverse(在对关 ...

  10. Linux CentOS 6.5 yum安装MongoDB的操作

    安装MongoDB的方法有很多种,可以源代码安装,在CentOS也可以用yum源安装的方法.由于MongoDB更新得比较快,我比较喜欢用yum源安装的方法.64位CentOS下的安装步骤如下: 1.准 ...