使用 C#的多颜色 DropDownList

分享于 

6分钟阅读

Web开发

  繁體

Screenshot - MultiColorDropdownListUsingCS.jpg

介绍

本文演示如何读取系统颜色,并在下拉 List的每一行中显示颜色。 在本示例中,我将展示:

  • 如何从 System.Drawing.KnownColor 枚举中获取颜色名称的List
  • 如何排除系统环境颜色,比如"活动边框""
  • 如何为下拉 List的每行分配颜色

背景

我被要求制作一个管理工具,其中可以设置不同类型的约会。 这些约会的颜色是独一无二的,管理员可以随时更改约会类型的颜色。

我开始想出一个下降 List,它的中颜色的NAME 会显示出来,那行的背景就是那种颜色。 有了这个观点,我搜索了网络,找不到很长时间的解决方案。 然后我终于找到了一个比需要更复杂的解决方案,涉及到。 所以我试图找到更简单的解决方案。

使用代码

我取一个名为 ddlMultiColor的List 控件来显示颜色名称和颜色。 我使用 <div> 标签 msgColor 来显示矩形方框中的颜色。

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

在服务器端,我们需要导入以下名称空间以便进一步编码。

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

让我先展示 Page.Load 事件。 在此事件中,将填充下拉 List,并执行颜色操作。

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

让我们来看看 populateDdlMultiColor() 方法。

privatevoid 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 是指定已知系统颜色的enum。 我已经用这些系统颜色填充了 allColors array。 为此,我使用了最基本的枚举功能之一: 共享 Enum.GetNames() 方法。这里方法检查枚举并为枚举中的每个值提供一个字符串的array。

然而,这种方法存在着问题。 在 array 中包括系统环境颜色 -- 比如"活动边框"--。 为了解决这个问题,我提取了系统环境颜色。 我使用了 System.Reflection.MemberInfo 类,获取有关成员属性的信息并提供对成员元数据的访问。

在这里,我用 System.Drawing.SystemColors的属性填充了 systemEnvironmentColors array。 然后我创建了一个名为 finalColorList的通用 List,其中只取了 KnownColor 中的那些颜色,但不在系统环境颜色中。 然后 List,finalColorList 被绑定到名为 ddlMultiColor的下拉 List。 这里时,我们有一个下降 List的颜色名称。 让我们来操纵这些颜色。

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

下拉 List的每一行通过该行颜色的NAME 将 style 属性分配给 background-color。 然后,下拉 List的背景颜色由选定的颜色指定。 下拉列表的OnSelectedIndexChanged 事件中添加了以下代码段,以便高亮显示选定颜色名称,并显示名为 msgColor<div> 标记以显示选定颜色的矩形图像。

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

Points of interest

我们已经学习了如何从 System.Drawing 获得颜色,排除系统环境颜色,将列表绑定到下拉列表,并根据颜色的名称给每行指定颜色。 就是这样快乐编码 !

历史记录

  • 24th 2007年06月