使用 C# 的多色下拉列表






4.83/5 (29投票s)
2007 年 6 月 26 日
3分钟阅读

222843

3539
一篇关于读取系统颜色并准备多色下拉列表的文章
引言
本文演示了如何读取系统颜色并为下拉列表的每一行着色。在这个例子中,我将展示
- 如何从
System.Drawing.KnownColor
枚举中获取颜色名称列表 - 如何排除系统环境颜色,例如“活动边框”
- 如何为下拉列表的每一行分配颜色
背景
我被要求制作一个管理工具,可以设置不同类型的预约。这些预约将具有独特的颜色,管理员可以随时更改预约类型的颜色。
我开始考虑一个下拉列表,其中将显示颜色的名称,并且该行的背景将是该颜色。考虑到这一点,我在网上搜索,但很长时间都找不到任何解决方案。然后我终于找到了一个看起来比所需复杂得多的解决方案,其中涉及一个数据库。所以我尝试寻找一个更简单的解决方案。
使用代码
我正在使用一个名为ddlMultiColor
的下拉列表控件来显示颜色名称和颜色。我正在使用一个<div>
标签,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 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()
方法。此方法检查一个枚举并提供一个字符串数组,枚举中的每个值对应一个字符串。
然而,这种方法存在一个问题。它在数组中包含了系统环境颜色,例如“活动边框”。为了解决这个问题,我提取了系统环境颜色。我使用了System.Reflection.MemberInfo
类,该类获取有关成员属性的信息,并提供对成员元数据的访问。
在这里,我用System.Drawing.SystemColors
的属性填充了systemEnvironmentColors
数组。然后,我创建了一个名为finalColorList
的泛型列表,其中只包含了KnownColor
中存在但不在系统环境颜色中的那些颜色。然后,该列表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);
}
下拉列表的每一行都通过该行颜色的名称被分配了background-color
的style
属性。然后,下拉列表的背景颜色由选定的颜色分配。在下拉列表的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
中获取颜色,排除系统环境颜色,将列表绑定到下拉列表,并根据颜色名称为每一行分配颜色。就这样!编码愉快!!
历史
- 2007年6月24日