2011-09-21 33 views
1

上一个WebForm一个列表框被填充由数据源在SQL Server 2008asp.net:列表框中的项目变色

取决于在列表框中的文本上,我会liek特定的backgroudn颜色项目是一个特定的颜色

例如,如果这些都在列表中的项目:

AA item 1 
AA item 2 
BB item 3 
BB item 4 
AA item 5 

,如果该项目始于AA,然后进行后台​​如果该项目的生命与BB然后让我t blue

我该怎么做?

该解决方案可以是客户端或服务器端,不事关我

我正在currenlty这样做:

function colorproblemlist() { 
     ob = document.getElementById('lstProblems'); 
     for (var i = 0; i < ob.options.length; i++) { 
      if (ob.options[i].value.indexOf('AA')!=-1) { 
       ob.options[i].style.color = "red"; 
      } 
     } 

    } 

,它的工作伟大的!

但是,我有以下的并发症。

第一列如你看到下面:

AA item 1 
AA item 2 
BB item 3 
BB item 4 
AA item 5 

将不可见

只有第二个是可见的:

Item 1 
Item 2 
... 

此列:

AA 
AA 

..

是从中拉取数据的数据库表中的字段,我需要基于该字段的颜色。

我怎么能做到这一点>

+0

如何从'AA'去'green'?如果您可以在客户端代码中指定此算法,则可以使用JQuery将颜色设置为项目的背景。 – thekip

+0

@thekip伟大你能告诉我如何做到这一点与jQuery? –

+0

@thekip IVE编辑□请再看看 –

回答

2

喜欢的东西:

function colorproblemlist() { 
    ob = document.getElementById('lstProblems'); 
    for (var i = 0; i < ob.options.length; i++) { 
     var option = ob.options[i]; 

     switch(option.value.substr(0,2)) 
     { 
      case "AA": 
       option.style.color = "Red"; 
      break; 
      case "BB": 
       option.style.color = "Green"; 
      break; 
     } 

     option.value = option.value.slice(3); //Assumption of 'AA ' 
    } 
} 

基于从html中删除AA,BB标志,修改客户端上的颜色将不再可能。

+0

非常感谢,我添加了一些轻微的复杂性 –

5

服务器端方法:

<asp:ListBox ID="prevSubList" runat="server" Height="16px" DataTextField="Key" 
DataValueField="Value" Width="263px" Rows="1" 
OnDataBound="prevSubList_DataBound"> 
</asp:ListBox> 

而DataBound事件作为处理如下:

protected void prevSubList_DataBound(object sender, EventArgs e) 
{ 
    foreach (ListItem item in prevSubList.Items) 
    { 
     if (item.Text.Contains("AA")) 
      item.Attributes.Add("style","background-color:green;"); 
     else if(item.Text.Contains("BB")) 
      item.Attributes.Add("style", "background-color:blue;"); 
    } 
} 
+0

非常感谢你,我添加了一个稍微复杂 –

+1

@I__你不能用一个ListBox做到这一点很容易(我的意思是,你可以使用各种黑客的这种)但ListBox通常不是一个好的选择,如果你有不止一个文本和值,因为它在浏览器上呈现为'' – Icarus

+1

我必须改变这个'OnPreRender'而不是DataBound,因为颜色丢失了在回发。 –

2

由于控制颜色的数据不是listitem的一部分,因此您必须在添加项目之前手动添加项目并为它们添加颜色。

ASPX页面:

<asp:ListBox ID="testListBox" runat="server" 
    onload="TestListBoxOnLoad"> 
</asp:ListBox> 

代码隐藏(我只是用一个字符串数组和它们的长度来测试它,你的逻辑会有所不同):

private string[] testData = new string[] { "Alpha", "Beta", "Gamma", "Delta", "Eta", "Theta", "Zeta", "Iota" }; 

protected void TestListBoxOnLoad(object sender, EventArgs e) 
{ 
    foreach (var data in testData) 
    { 
     ListItem item = new ListItem() 
     { 
      Text = data 
     }; 

     if (data.Length < 5) 
     { 
      item.Attributes.Add("class", "aaStyle"); 
     } 
     else 
     { 
      item.Attributes.Add("class", "bbStyle"); 
     } 

     testListBox.Items.Add(item); 
    } 
} 
0

我不不知道这是否违反了asp.net.net mvc的规则,但我所做的解决类似问题的方法是不使用@Html.ListBoxFor

我检查一下@Html.ListBoxFor添加到HTML和手工做了验证。

我想如果我更改列表的名称(模型),我得回到我的代码,并手动修改它太(少可扩展性和维护的代码)

这是我的情况:

<label for="EventsList" style="font-size:.9em" >Evento</label>     
<select id="EventsList" multiple="multiple" name="Eventos"> 
    @foreach (var evento in Model.Eventos) 
    { 
     string style = ""; 
     switch (evento.Estado) 
     { 
      case 0: 
       style = "background-color:#ff6868"; 
       break; 
      case 1: 
       style = "background-color:#ff8355"; 
       break; 
      case 2: 
       style = "background-color:#fcfc6a"; 
       break; 
      case 3: 
       style = "background-color:#79d779"; 
       break; 
     } 
     <option value="@evento.Id" style="@style">@evento.Descripcion</option> 
    } 
</select> 
相关问题