Asp.net自定义控件之单选、多选控件

本文实例为大家分享了Asp.net单选、复选框控件的具体实现代码,供大家参考,具体内容如下

将常用的jquery插件封装成控件也是个不错的选择。

先看看效果:

1.新建类库项目,创建数据源类

 [Serializable]
 public class Select2Item
 {
 public bool Selected { get; set; }

 public string Text { get; set; }

 public string Value { get; set; }

 public Select2Item() { }

 public Select2Item(string text, string value)
 {
  this.Text = text;
  this.Value = value;
 }

 public Select2Item(string text, string value, bool selected)
 {
  this.Text = text;
  this.Value = value;
  this.Selected = selected;
 }
 }

2.创建控件类CheckList,继承与WebControl,并定义 public List<Select2Item> Items数据项属性。

3.引入脚本文件及样式文件 
a.创建脚本或样式文件,设置文件的属性-生成操作-嵌入的资源

b.需要在namespace上添加标记 [assembly: WebResource("命名空间.文件夹名.文件名", "mime类型")]
如:
    [assembly: WebResource("Control.Style.checklist.css", "text/css",PerformSubstitution = true)]
    [assembly: WebResource("Control.Scripts.checklist.js", "application/x-javascript")]

如果css文件里面存在图片的话,同样将图片设置为嵌入的资源,在css中的写法为<%=WebResource("命名空间.文件夹名.文件名")%> 
 PerformSubstitution 表示嵌入式资源的处理过程中是否分析其他Web 资源 URL,并用到该资源的完整路径替换。
c.重写protected override void OnPreRender(EventArgs e),引入嵌入的脚本或样式文件
 if(Page!=null) Page.Header.Controls.Add(LiteralControl),将<script><link>标签放到LiteralControl中,然后将LiteralControl添加到Page.Header中,最后在页面里你就会看到引入的<script><link>标签。

 protected override void OnPreRender(EventArgs e)
 {
  if (this.Page != null)
  {
  StringBuilder sbb = new StringBuilder();
  sbb.Append(string.Format(STYLE_TEMPLATE, Page.ClientScript.GetWebResourceUrl(this.GetType(), "HandControl.Style.checklist.css")));
  sbb.Append(string.Format(SCRIPT_TEMPLATE, Page.ClientScript.GetWebResourceUrl(this.GetType(), "HandControl.Scripts.checklist.js")));

  bool hascss = false;
  LiteralControl lcc = new LiteralControl(sbb.ToString());
  lcc.ID = "lccheck";
  foreach (Control item in Page.Header.Controls)
  {
   if (item.ID == "lccheck")
   hascss = true;
  }
  if (!hascss)
   Page.Header.Controls.Add(lcc);
  }
  base.OnPreRender(e);
 }

4.重写控件的protected override void Render(HtmlTextWriter writer)方法
这里主要是渲染控件的html,根据你的控件而定。

 protected override void Render(HtmlTextWriter writer)
 {
  if (Items.Count > 0)
  {
  writer.Write("<div id='div" + this.ClientID + "' class='c01-tag-div' mul='" + (Multiple == true ? "1" : "0") + "'>");
  if (Multiple == false)
   writer.Write("<input name='tb" + this.ClientID + "' type='hidden' value='" + Items[0].Value + "' />");
  else
   writer.Write("<input name='tb" + this.ClientID + "' type='hidden' />");
  bool first = true;
  foreach (var item in Items)
  {
   if (Multiple == false)
   {
   if (item.Selected && first)
   {
    writer.Write("<a title='" + item.Text + "' class='c01-tag-item c01-tag-select' val='" + item.Value + "' tag='Y'>" + item.Text + "</a>");
    first = false;
   }
   else
   {
    writer.Write("<a title='" + item.Text + "' class='c01-tag-item' val='" + item.Value + "' tag='N'>" + item.Text + "</a>");
   }
   }
   else
   {
   if (item.Selected)
    writer.Write("<a title='" + item.Text + "' class='c01-tag-item c01-tag-select' val='" + item.Value + "' tag='Y'>" + item.Text + "</a>");
   else
    writer.Write("<a title='" + item.Text + "' class='c01-tag-item' val='" + item.Value + "' tag='N'>" + item.Text + "</a>");
   }
  }
  writer.Write("</div>");
  }
 }

5.添加GetSelected方法,返回List<Select2Item>,添加GetSelectValue,返回String(多选以,号隔开)

 public List<Select2Item> GetSelected()
 {
  if (Page != null)
  {
  var values = Page.Request.Form["tb" + this.ClientID].Split(',');
  var res = Items.Where(t => values.Contains(t.Value)).ToList();
  foreach (var item in Items)
  {
   if (res.Contains(item))
   {
   item.Selected = true;
   }
   else
   {
   item.Selected = false;
   }
  }
  return res;
  }
  else
  {
  return null;
  }
 }
 public string GetSelectValue()
 {
  if (Page != null)
  {
  return Page.Request.Form["tb" + this.ClientID];
  }
  return "";
 }

6.保存状态
 你需要重写两个方法protected override object SaveViewState() 、protected override void LoadViewState(object savedState),旨在将Items数据项属性保存到ViewState

 protected override object SaveViewState()
 {
  var valuestr = Page.Request.Form["tb" + this.ClientID];
  if (!string.IsNullOrEmpty(valuestr))
  {
  var values = valuestr.Split(',');
  var temp = Items.Where(t => values.Contains(t.Value)).ToList();
  foreach (var item in temp)
  {
   item.Selected = true;
  }
  }
  return new object[] { base.SaveViewState(), Items };
 }

 protected override void LoadViewState(object savedState)
 {
  object[] vState = (object[])savedState;
  if (vState[0] != null)
  base.LoadViewState(vState[0]);
  if (vState[1] != null)
  Items = (List<Select2Item>)vState[1];
 }

7.单选和复选的设置,在js中控制
 添加属性 
[Description("获取和设置多选"), DefaultValue(true), Browsable(true), Category("杂项")]
public bool Multiple { get; set; }
 在OnPreRender代码中你会发现Multiple属性会影响div的mul属性值,从而判断是否多选(默认多选)
 8.其它说明
private static readonly string STYLE_TEMPLATE = "<link href=\"{0}\" rel=\"stylesheet\" type=\"text/css\" />\r\n";
 private static readonly string SCRIPT_TEMPLATE = "<script type=\"text/javascript\" src=\"{0}\"></script>\r\n";

效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • ASP.NET单选按钮控件RadioButton常用属性和方法介绍

    1.常用属性: (1)Checked属性:用来设置或返回单选按钮是否被选中,选中时值为true,没有选中时值为false. (2)AutoCheck 属性:如果 AutoCheck 属性被设置为 true(默认),那么当选择该单选按钮时,将自动清除该组中所有其他单选按钮.对一般用户来说,不需改变该属性,采用默认值(true)即可. (3)Appearance 属性:用来获取或设置单选按钮控件的外观.当其取值为 Appearance.Button 时,将使单选按钮的外观像命令按钮一样:当选定它时,

  • 关于asp.net 自定义分页控件

    这几天空学习了下自定义控件,参考了aspnetpager开发了自己的分页控件.相对aspnetpager来说功能是多,但个人感觉他的代码太多. 界面: 使用: <%@ Register assembly="YSM.AspNetPager" namespace="YSM.AspNetPager" tagprefix="cc1" %> 页面注册控件,也可以在web.config中配置 1.ajax之UpdatePanel分页则把控件放到U

  • asp.net自定义控件代码学习笔记

    效果:在放这个控件的页面: XML/HTML 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="test6.aspx.cs" Inherits="test6" %> <%@Register TagPrefix="custom" Namespace="myComponents" %>

  • 浅谈ASP.NET中最简单的自定义控件

    ASP.NET用户控件一般适用于产生相对静态的内容,所以没有builtin的事件支持.本文讨论用户控件返回事件的方法. 假定用户控件(UserControl.ascx)中包含按钮控件AButton,希望实现按AButton按钮时,包含该用户控件的页面可以接收到事件.为此,小鸡射手在用户控件和页面的代码中分别作了处理. UserControl.ascx.cs中的处理:         1. 定义public的事件委托,如ClickEventHandler;         2. 在UserCont

  • ASP.NET中 CheckBox复选框控件的使用

    我们可以使用两种类型的 ASP.NET 控件将复选框添加到 Web 窗体页上:单独的 CheckBox 控件或 CheckBoxList 控件.两种控件都为用户提供了一种输入布尔型数据(真或假.是或否)的方法. 这里我们单独使用CheckBox,先来看看它的属性 属性 描述 .NET AutoPostBack 规定在 Checked 属性已改变后,是否立即向服务器回传表单.默认是 false. 1.0 CausesValidation 规定点击 Button 控件时是否执行验证. 2.0 Che

  • ASP.NET中CheckBoxList复选框列表控件详细使用方法

    可以使用两种类型的 ASP.NET 控件将复选框添加到 Web 窗体页上:单独的 CheckBox 控件或 CheckBoxList 控件.两种控件都为用户提供了一种输入布尔型数据(真或假.是或否)的方法. 本文主要介绍CheckBoxList,不言而喻,看到List就知道是一个列表(集合),一个控件可以包含多个CheckBox,下面让我们来看看具体的用法. 1.绑定数据 复制代码 代码如下: this.lngCatalogID.DataSource = dt; //这里我绑到DataTable

  • asp.net 自定义控件实现无刷新上传图片,立即显示缩略图,保存图片缩略图

    如图: 点击浏览,选择图片之后,右面显示图片 第一步: 创建CtFileUpLoad.ascx 复制代码 代码如下: <%@ Control Language="C#" AutoEventWireup="true" CodeFile="CtFileUpLoad.ascx.cs" Inherits="WebParts_CtFileUpLoad" %> <table cellpadding="0&quo

  • ASP.NET中 RadioButtonList 单选按钮组控件的使用方法

    RadioButtonList 控件表示一个封装了一组单选按钮控件的列表控件. 可以使用两种类型的 ASP.NET 控件将单选按钮添加到网页上:各个 RadioButton 控件或一个 RadioButtonList 控件.这两类控件都允许用户从一小组互相排斥的预定义选项中进行选择.使用这些控件,可定义任意数目的带标签的单选按钮,并将它们水平或垂直排列. 一.常用属性 属性 值 作用 RepeatDirection Horizontal|Vertical 项的布局方向:水平方向|竖直风向 Rep

  • Asp.net 动态加载用户自定义控件,并转换成HTML代码

    如果页面单纯的使用js来创建,要写大量的代码,而且不直观. 在asp.net中,其实我们可以创建用户自定义控件,通过Ajax请求返回用户自定义控件HTML代码. 复制代码 代码如下: public static string RangerUsControl(string controlName) { StringBuilder build = new StringBuilder(); HtmlTextWriter htmlWriter = new HtmlTextWriter(new Strin

  • asp.net DropDownList自定义控件,让你的分类更清晰

    看到Discuz是2个下拉列表进行合并的,网上找了一些资料,然后写了这个小源码,在这里和大家分享一下! 运行效果图,如下所示(深黑的地方选不中,因为那是上一级的分类): 项目结构图如下所示: Controls类库SmartDropDownList.cs代码如下所示: SmartDropDownList.cs 复制代码 代码如下: using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using Syste

随机推荐