建立一個下拉選單,列出 .NET System.Drawing.KnownColor 列舉中的所有顏色(排除系統環境色),每個選項背景顯示對應顏色,選中時右側區塊同步顯示該顏色色塊。
Enum.GetNames(typeof(KnownColor)) 取得所有顏色名稱陣列SystemColors 屬性取得系統環境色名稱,進行排除ListItem 設定 style="background-color:..." 實現選項著色SelectedIndexChanged 事件更新下拉框背景與右側預覽區<table>
<tr>
<td>
<asp:DropDownList ID="ddlMultiColor" runat="server"
AutoPostBack="true"
OnSelectedIndexChanged="ddlMultiColor_SelectedIndexChanged">
</asp:DropDownList>
</td>
<td>
<div id="divPreview" runat="server" style="width:30px;height:25px;border:1px solid #ccc;"></div>
</td>
</tr>
</table>
using System; using System.Collections.Generic; using System.Drawing; using System.Reflection; using System.Web.UI.WebControls;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
PopulateColorList();
ApplyItemStyles();
}
}
private ListGetFilteredColorNames() { // 1. 所有 KnownColor 名稱 string[] allColors = Enum.GetNames(typeof(KnownColor)); // 2. 系統環境色名稱(透過反射取得 SystemColors 所有屬性名) var sysColorProps = typeof(SystemColors).GetProperties(BindingFlags.Static | BindingFlags.Public); var sysColorNames = new HashSet (sysColorProps.Select(p => p.Name)); // 3. 排除系統色 return allColors.Where(c => !sysColorNames.Contains(c)).ToList(); }
private void PopulateColorList()
{
var colors = GetFilteredColorNames();
ddlMultiColor.DataSource = colors;
ddlMultiColor.DataBind();
}
private void ApplyItemStyles()
{
foreach (ListItem item in ddlMultiColor.Items)
{
// 項目 Value 即顏色名稱,直接用於 CSS background-color
item.Attributes["style"] = $"background-color:{item.Value}; color:{(IsDarkColor(item.Value) ? "white" : "black")}";
}
// 同步設定下拉框本身背景
ddlMultiColor.BackColor = Color.FromName(ddlMultiColor.SelectedItem.Text);
}
private bool IsDarkColor(string colorName)
{
try
{
Color c = Color.FromName(colorName);
// 亮度公式:0.299*R + 0.587*G + 0.114*B
double luminance = 0.299 * c.R + 0.587 * c.G + 0.114 * c.B;
return luminance < 128;
}
catch { return false; }
}
protected void ddlMultiColor_SelectedIndexChanged(object sender, EventArgs e)
{
// 1. 更新下拉框背景
ddlMultiColor.BackColor = Color.FromName(ddlMultiColor.SelectedItem.Text);
// 2. 重新套用項目樣式(確保當前選項可見)
ApplyItemStyles();
// 3. 更新右側預覽區
divPreview.Attributes["style"] =
$"background:{ddlMultiColor.SelectedItem.Value};width:30px;height:25px;border:1px solid #ccc;";
}
下拉選單展開時,每個項目呈現對應顏色背景;選中項目時,下拉框本身與右側 div 同步顯示該顏色。
| 技術 | 應用 |
|---|---|
Enum.GetNames | 快速取得列舉所有成員名稱字串陣列 |
反射 Type.GetProperties | 動態取得 SystemColors 靜態屬性名稱集合 |
ListItem.Attributes | 為選項注入內聯 CSS 樣式 |
Color.FromName | 依名稱建立 Color 結構,支援 KnownColor、HTML 顏色名 |
| 亮度計算 | 動態決定前景文字顏色(黑/白)確保可讀性 |
ColorPicker 對話框Application 或 MemoryCache,避免每次反射善用 .NET 內建 KnownColor 列舉與反射機制,配合 ListItem.Attributes 注入樣式,即可零第三方依賴實現專業級彩色下拉選單。關鍵在於:排除系統環境色避免干擾、動態計算對比色確保可讀性、事件同步更新預覽區。此技術廣泛適用於 CMS 樣式設定、報表圖表配色、設計工具等場景。