博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态变更网页样式
阅读量:6219 次
发布时间:2019-06-21

本文共 4738 字,大约阅读时间需要 15 分钟。

今天想做些练习,做什么呢?还是练习一下动态变更样式吧。此博文在应用用户控件,接口,事件等知识,可以让你学习到编程的思想,如果是你来写,你是从哪一步开始,或是有另外种写法,都可达到相同的目标,绝招同途异路。

准备三种样式,在站点中创建一个目录"StyleSheet"用来存储样式文件,样式文件名分别为StyleSheet.css,SS_css1.css和SS_css2.css。

StyleSheet.css
body{       }.textbox {
border:solid 1px #000;}

 

SS_css1.css
body{       }.textbox {
border:solid 1px #0094ff; }

 

SS_css2.css
body{       }.textbox {
border:solid 1px #f00; }

创建一个aspx网页,创建时,把Place code in separate file选项选中,将代码放在单独的文件。
拉StyleSheet.css样式文件入aspx网页中,为样式链接添加ID和runat属性

还要往网页拉一个asp:TextBox控件,添加CssClass="textbox"属性。

完整aspx如下:

 

现在需要做的是,网页运行时,能够变更它的样式:

protected void Page_Load(object sender, EventArgs e)    {        this.StyleSheet1.Attributes["href"] = "~/StyleSheet/" + "StyleSheet.css";   //变更样式名称    }

动画演示:
 

 

看完演示动画,教程也算完了,但Insus.NET却要疯了,不可能每变更一次,去打开代码来修改一次,这是最糟糕的做法。

怎样做呢?Insus.NET做到的在网页放置各种样式,用户点选就是了。根据例子,做好三张图片,放在站点的Img目录之下。

 

在.aspx网页显示此三张图片为图片铵钮:

在.cs分别好各自的OnClick事件,关Comment out Page_Load事件内的代码:

View Code
protected void Page_Load(object sender, EventArgs e)    {        //this.StyleSheet1.Attributes["href"] = "~/StyleSheet/" + "StyleSheet.css";   //变更样式名称    }    protected void ImageButton1_Click(object sender, ImageClickEventArgs e)    {        this.StyleSheet1.Attributes["href"] = "~/StyleSheet/" + "StyleSheet.css";    }    protected void ImageButton2_Click(object sender, ImageClickEventArgs e)    {        this.StyleSheet1.Attributes["href"] = "~/StyleSheet/" + "SS_css1.css";    }    protected void ImageButton3_Click(object sender, ImageClickEventArgs e)    {        this.StyleSheet1.Attributes["href"] = "~/StyleSheet/" + "SS_css2.css";    }

看看改变后的效果:

 

 写到这里,Insus.NET又发现,每个事件中的代码冗余,因此Insus.NET把它抽取为一个方法,然后每个事件中直接执行这个方法,并传入相应的参数即可:

View Code
protected void ImageButton1_Click(object sender, ImageClickEventArgs e)    {        DynamicallySetStyleSheet("StyleSheet.css");    }    protected void ImageButton2_Click(object sender, ImageClickEventArgs e)    {        DynamicallySetStyleSheet("SS_css1.css");    }    protected void ImageButton3_Click(object sender, ImageClickEventArgs e)    {        DynamicallySetStyleSheet("SS_css2.css");    }    //改善代码冗余,抽取为一个方法。    private void DynamicallySetStyleSheet(string cssName)    {        this.StyleSheet1.Attributes["href"] = "~/StyleSheet/" + cssName;    }

 

 呵呵,程序一步一步完善,可以想一下,日后样式需要增多,每增一次,又得来打开这个网页,添加图片按钮,添加事件...

是否可以不做到“改变一点而动全身”呢?程序是可以尝试一下的。

 Insus.NET想到的是,把这部常变的代码,移至一个用户控件(ascx)内,有什么奕化,只更改此ascx即可。以下面在站点创建一个用户控件DynamicallySetupStyle.ascx:

然后把把三个按钮的html 剪下,粘帖于用户控件。

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="DynamicallySetupStyle.ascx.cs" Inherits="DynamicallySetupStyle" %>

三个OnClick事件也照搬:

View Code
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;public partial class DynamicallySetupStyle : System.Web.UI.UserControl{    protected void Page_Load(object sender, EventArgs e)    {    }    protected void ImageButton1_Click(object sender, ImageClickEventArgs e)    {        DynamicallySetStyleSheet("StyleSheet.css");    }    protected void ImageButton2_Click(object sender, ImageClickEventArgs e)    {        DynamicallySetStyleSheet("SS_css1.css");    }    protected void ImageButton3_Click(object sender, ImageClickEventArgs e)    {        DynamicallySetStyleSheet("SS_css2.css");    }   }

此时的程序,在ascx的每个OnClick事件中,会找不到DynamicallySetStyleSheet(string xxx)方法,因为Insus.NET没有搬过去。怎样解决这个跨页访问方法的问题呢?不用担心,很简单的。
可以写一个接口,接口内的方法,就是与Page的private的方法一样:

ISetValable
using System;using System.Collections.Generic;using System.Linq;using System.Web;/// /// Summary description for ISetValable/// namespace Insus.NET{    public interface ISetValable    {       void DynamicallySetStyleSheet(string cssName);    }}

然后在.aspx.cs件实作这个接口即可,实作之后,原先的Private已经变为Public修饰符了,参考下图高亮位置。

 

下面是用户控件的代码,参考高亮的位置:

 

 最后是用户控件拉至.aspx网页中:

 

经过这样一改,有样式添加的话,我们只需要更改此用户控件即可。不必去动那个.aspx网页了。
写到此, 如果以添加多几个样式,供用户选择,需要添加一个ImageButton,还要写事件,这样的话,用户控件的事件也许会越来越多。Insus.NET又想到要重构这个用户控件。看看怎样才不用动很多地方。

在DynamicallySetupStyle.ascx网页,拿掉所有ImageButton代码,用PlaceHolder控件来替代。

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="DynamicallySetupStyle.ascx.cs" Inherits="DynamicallySetupStyle" %><%--
 
--%>

在DynamicallySetupStyle.ascx.cs中,拿掉所有ImageButton事件:

//protected void ImageButton1_Click(object sender, ImageClickEventArgs e)    //{    //    DynamicallySetStyleSheet("StyleSheet.css");    //}    //protected void ImageButton2_Click(object sender, ImageClickEventArgs e)    //{    //    DynamicallySetStyleSheet("SS_css1.css");    //}    //protected void ImageButton3_Click(object sender, ImageClickEventArgs e)    //{    //    DynamicallySetStyleSheet("SS_css2.css");    //}

取而代之的是:

 

经过此一改,以后添加样式,或减少样式,只改上图高亮位置两行代码。

 

转载地址:http://owlja.baihongyu.com/

你可能感兴趣的文章
微信支付申请90%的商户都卡在这儿了,申请微信支付,商户功能设置详细说明...
查看>>
高仿Instagram 页面效果android特效
查看>>
2016 年总结
查看>>
将String转化成Stream,将Stream转换成String
查看>>
java路径Java开发中获得非Web项目的当前项目路径
查看>>
【工具使用系列】关于 MATLAB 遗传算法与直接搜索工具箱,你需要知道的事
查看>>
Kali-linux Arpspoof工具
查看>>
PDF文档页面如何重新排版?
查看>>
基于http协议使用protobuf进行前后端交互
查看>>
bash腳本編程之三 条件判断及算数运算
查看>>
php cookie
查看>>
linux下redis安装
查看>>
弃 Java 而使用 Kotlin 的你后悔了吗?| kotlin将会是最好的开发语言
查看>>
JavaScript 数据类型
查看>>
量子通信和大数据最有市场突破前景
查看>>
StringBuilder用法小结
查看>>
对‘初学者应该选择哪种编程语言’的回答——计算机达人成长之路(38)
查看>>
如何申请开通微信多客服功能
查看>>
Sr_C++_Engineer_(LBS_Engine@Global Map Dept.)
查看>>
非监督学习算法:异常检测
查看>>