开发背景
有人曾经要我开发一个根据不同选择而显示不同颜色的管理工具我开始考虑利用下拉框来实现条目背景及显示颜色根据条目名称不同而进行变化根据这个思路我在网上搜了半天也没有找到任何相关的解决方案最后我想到了一个比当初需求要复杂的方案(包括数据库)所以我尝试着找到一个更简单的实现方案
该文主要是演示如何读取系统颜色并在下拉框中的每个条目中显示对应的颜色该源码主要展示以下内容
如何获得SystemDrawingKnownColor颜色控件的列表枚举
如何排除系统环境颜色如Active Border
如何分配颜色到下拉框的每个条目
代码详解
命名下拉框为ddlMultiColor 来显示颜色名称及颜色用<div>标签显示右侧矩形结果Aspx代码如下
<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>
在cs文件中我们需要引用以下命名空间
using System;
using SystemWeb;
using SystemReflection;
using SystemDrawing;
using SystemCollectionsGeneric;
我们先看一下Page_Load事件在Page_Load中我们对选中的下拉列表进行处理显示
protected void Page_Load(object sender EventArgs e)
{
if (PageIsPostBack == false)
{
populateDdlMultiColor(); //
colorManipulation();
}
}
现在让我们来看一下populateDdlMultiColor() 函数
private void populateDdlMultiColor()
{
ddlMultiColorDataSource = finalColorList();
ddlMultiColorDataBind(); //liudao 翻译
}
finalColorList()方法
private List finalColorList()
{
string[] allColors = EnumGetNames(typeof(SystemDrawingKnownColor));
string[] systemEnvironmentColors =
new string[(
typeof(SystemDrawingSystemColors))GetProperties()Length];
int index = ;
foreach (MemberInfo member in (
typeof(SystemDrawingSystemColors))GetProperties())
{
systemEnvironmentColors[index ++] = memberName;
}
List finalColorList = new List();
foreach (string color in allColors)
{
if (ArrayIndexOf(systemEnvironmentColors color) < )
{
finalColorListAdd(color);
}
}
return finalColorList;
}
SystemDrawingKnownColor是系统本身自带颜色我已经通过枚举列出了这些颜色并通过 finalColorList()函授进行绑定为了实现该功能我使用了最基本的枚举特征之一EnumGetNames() 共享方法该方法对枚举内容进行检测并输出结果为字符串序列该字符串中每个值都对应枚举中的每个结果
然而该方法还是有些问题的按照上面的思路枚举金额过中会包括系统环境颜色比如Active Border(注活动边框)为了解决该问题我扩展了系统环境颜色我用了SystemReflectionMemberInfo类
这里我用SystemDrawingSystemColors属性填充systemEnvironmentColors 然后创建一个名称为finalColorList 的图形列表在finalColorList 中我只调用已知颜色但是不在系统环境颜色中然后把finalColorList绑定到ddlMultiColor中至此我们已经有了一个包括全部颜色名称的下拉框下面让我们来操作一下
private void colorManipulation()
{
int row;
for (row = ; row < ddlMultiColorItemsCount ; row++)
{
ddlMultiColorItems[row]AttributesAdd(style
backgroundcolor: + ddlMultiColorItems[row]Value);
}
ddlMultiColorBackColor =
ColorFromName(ddlMultiColorSelectedItemText);//liudao翻译
}
下拉框中的每一行背景颜色的Style]属性都与该行显示的颜色名称对应的在OnSelectedIndexChanged 事件中下拉框中被选中的行通过下面的函数结合<div>标签进行高亮显示同时右侧的矩形颜色也随之变化
protected void ddlMultiColor_OnSelectedIndexChanged(object sender
EventArgs e)
{
ddlMultiColorBackColor = ColorFromName(ddlMultiColorSelectedItemText);
colorManipulation();
ddlMultiColorItemsFindByValue(ddlMultiColorSelectedValue)Selected =
true;
msgColorAttributesAdd(style background: +
ddlMultiColorSelectedItemValue + ;width:px;height:px;);
}
至此我们学会了如果获取SystemDrawing并排出系统环境颜色并绑定颜色名称到下拉列表