65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 C# 的多色下拉列表

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (29投票s)

2007 年 6 月 26 日

3分钟阅读

viewsIcon

222843

downloadIcon

3539

一篇关于读取系统颜色并准备多色下拉列表的文章

Screenshot - MultiColorDropdownListUsingCS.jpg

引言

本文演示了如何读取系统颜色并为下拉列表的每一行着色。在这个例子中,我将展示

  1. 如何从System.Drawing.KnownColor枚举中获取颜色名称列表
  2. 如何排除系统环境颜色,例如“活动边框”
  3. 如何为下拉列表的每一行分配颜色

背景

我被要求制作一个管理工具,可以设置不同类型的预约。这些预约将具有独特的颜色,管理员可以随时更改预约类型的颜色。

我开始考虑一个下拉列表,其中将显示颜色的名称,并且该行的背景将是该颜色。考虑到这一点,我在网上搜索,但很长时间都找不到任何解决方案。然后我终于找到了一个看起来比所需复杂得多的解决方案,其中涉及一个数据库。所以我尝试寻找一个更简单的解决方案。

使用代码

我正在使用一个名为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-colorstyle属性。然后,下拉列表的背景颜色由选定的颜色分配。在下拉列表的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日
© . All rights reserved.