C#创建多颜色下拉列表框 VS.net2003 VS.net2005

以下转自http://blog.csdn.net/photoplan/archive/2007/06/27/1668682.aspx
简介

这篇文章示范如何读取系统颜色并用它们染色下拉列表框(译注:下拉列表框是指 System.Web.UI.WebControls.DropDownList)的每一行。此例演示:

  1. 如何从 System.Drawing.KnownColor 枚举获取颜色名称列表
  2. 如何排除系统环境颜色,比如 "Active Border"
  3. 如何用颜色染色列表行

背景

有人要我做一个管理工具,在这个工具里,可以设置不同类型的约会,这些约会的颜色要唯一,并且管理员可以随时进行更改。

我开始想到使用下拉列表框将颜色名称显示出来,同时设置每一行的背景色。我在网上很长时间都找不到合适的解决办法。后来我找到了一个方案,但是涉及到数据库,过于复杂了。因此我试着找一个简单点儿的办法。


使用代码

将一个下拉列表框命名为 ddlMultiColor,用它来显示颜色名称和颜色本身。将一个 <div> 标记的 id 设置为 msgColor,它将在一个矩形框

显示中显示颜色。


  
  


在服务端,需要导入这些命名空间

 

using System;
using System.Web;
using System.Reflection;
using System.Drawing;
using System.Collections.Generic;

 


先来看一下 Page.Load 事件。组装下拉列表框和颜色处理是在这里进行的。

 

protected void Page_Load(object sender, EventArgs e)
{
    if (Page.IsPostBack == false)
    {
        populateDdlMultiColor();
        colorManipulation();
    }
}

 

来看一下 populateDdlMultiColor() 方法

 

private void populateDdlMultiColor()
{        
    ddlMultiColor.DataSource = finalColorList();
    ddlMultiColor.DataBind();
}

 

这里是 finalColorList() 方法的代码

 

private List  finalColorList()
{ 
    
    string[] allColors = Enum.GetNames(typeof(System.Drawing.KnownColor));
    string[] systemEnvironmentColors = new string[(typeof(System.Drawing.SystemColors)).GetProperties().Length];

    int index = 0;
    
    foreach (MemberInfo member in (typeof(System.Drawing.SystemColors)).GetProperties())
    {
        systemEnvironmentColors[index ++] = member.Name;            
    }

    List finalColorList =  new List
   
   ();
            
    foreach (string color in allColors)
    {
        if (Array.IndexOf(systemEnvironmentColors, color) < 0)
        {
            finalColorList.Add(color);
        }                           
    }

    return finalColorList;
    
}

 

System.Drawing.KnownColor 是已知道系统颜色的枚举。我们已经用这些系统颜色填充了 allColors 数组。为了实现这一目标,要用到枚举最基本的特性:Enum.GetNames() 静态方法。这个方法检查枚举并提供一个字符串数组,数组中的每个字符串与枚举中的一个值对应。

但是,还有一个问题,系统环境颜色 -- 例如 "Active Border" -- 也包含在数组中。为了解决这个问题,我们提取出系统环境颜色。这里用到了 System.Reflection.MemberInfo 类,这个类可以获取成员属性(attribute) 信息,并提供对成员元数据的访问。

这里使用 System.Drawing.SystemColors 的属性填充 systemEnvironmentColors 数组。然后创建一个泛型列表,finalColorList,把已知道颜色添加进去,但将系统环境颜色排除在外。稍后,finalColorList 列表将被绑定到 ddlMultiColor。到这里,下拉列表框里已经包含了颜色名称,下面我们来处理这些颜色。

private void colorManipulation()
{
    int row;
    for (row = 0; row < ddlMultiColor.Items.Count - 1; row++)
    {
        ddlMultiColor.Items[row].Attributes.Add("style", 
            "background-color:" + ddlMultiColor.Items[row].Value);
    }
    ddlMultiColor.BackColor = 
        Color.FromName(ddlMultiColor.SelectedItem.Text);
}


我们为下拉列表的每一行添加 style 属性(attribute),用行包含的颜色名称设置 background-color。并用选中的颜色设置下拉列表框本身的背景色。在下拉列表框的 OnSelectedIndexChanged 事件中,以下代码将选中的颜色高亮标出,并且设置 msgColor (一个 <div> 标记),让它显示选中的颜色的矩形图像。

protected void ddlMultiColor_OnSelectedIndexChanged(object sender, 
    EventArgs e)
{        
    ddlMultiColor.BackColor = Color.FromName(ddlMultiColor.SelectedItem.Text);
    colorManipulation();   
    ddlMultiColor.Items.FindByValue(ddlMultiColor.SelectedValue).Selected =  true;    
    msgColor.Attributes.Add("style", "background:" + 
        ddlMultiColor.SelectedItem.Value + ";width:30px;height:25px;");
}

以上文章代码可以在VS2005中实现,但vs.net2003没有List类,我将代码稍作修改以适应vs2003

//绑定字体颜色,获取系统颜色
  private void BindFontColor()
  {
   string[] allColors = Enum.GetNames(typeof(System.Drawing.KnownColor));
   string[] systemEnvironmentColors = new string[(typeof(System.Drawing.SystemColors)).GetProperties().Length];

   int index = 0;

   foreach (MemberInfo member in (typeof(System.Drawing.SystemColors)).GetProperties())
   {
    systemEnvironmentColors[index ++] = member.Name;            
   }

   foreach (string color in allColors)
   {
    if (Array.IndexOf(systemEnvironmentColors, color) < 0)
    {
     _dplFontColorItem+="
  • "+color+""; //用字符串填充htmselect } } //ColorManipulation(); }
    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值