以下转自http://blog.csdn.net/photoplan/archive/2007/06/27/1668682.aspx
简介
这篇文章示范如何读取系统颜色并用它们染色下拉列表框(译注:下拉列表框是指 System.Web.UI.WebControls.DropDownList)的每一行。此例演示:
- 如何从 System.Drawing.KnownColor 枚举获取颜色名称列表
- 如何排除系统环境颜色,比如 "Active Border"
- 如何用颜色染色列表行
背景
有人要我做一个管理工具,在这个工具里,可以设置不同类型的约会,这些约会的颜色要唯一,并且管理员可以随时进行更改。
我开始想到使用下拉列表框将颜色名称显示出来,同时设置每一行的背景色。我在网上很长时间都找不到合适的解决办法。后来我找到了一个方案,但是涉及到数据库,过于复杂了。因此我试着找一个简单点儿的办法。
使用代码
将一个下拉列表框命名为 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();
}