您的位置:首页 > 编程语言 > C#

翻译:C#创建多颜色下拉列表框(Multi-color DropDownList using C#)

2007-06-27 14:30 501 查看


简介

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

如何从 System.Drawing.KnownColor 枚举获取颜色名称列表

如何排除系统环境颜色,比如 "Active Border"

如何用颜色染色列表行


背景

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

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


使用代码

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

显示中显示颜色。

<table>
<tr>
<td>
<asp:DropDownList ID ="ddlMultiColor"
OnSelectedIndexChanged="ddlMultiColor_OnSelectedIndexChanged"
runat="server" AutoPostBack="true">
</asp:DropDownList>
</td>
<td>
<div id="msgColor" runat="server">
</div>
</td>
</tr>
</table>

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

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<string> 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<string> finalColorList = new List<string>();

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;");
}


要点

现在,我们了解了如何从 System.Drawing 获取颜色,将系统环境颜色排除在外,将列表绑定到下拉列表框,也了解了如何按照颜色名称为每一行设置颜色。就是它!祝你编码愉快!


历史

24th June, 2007

翻译说明:这篇文章是 codeproject 上的,作者Fuad Bin Omar,原文地址:http://www.codeproject.com/aspnet/csMultiColorDropDownList.asp,你可以在这里下载源代码。翻译的不好,请多批评。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: