[原创]实现给DropDownList下拉框控件子项增加自己Attribute特性...

   前不久,看到腾讯站上有个下拉框控件里面子项的字体都是五颜六色,感觉挺好看的!然后想想也想做一个,也学习一下,组件设计不是很了解!看过一些书..望大家多多指教!

   但是中间遇到不少问题,非常感谢Haneryfan1朋友的帮助!现把代码帖出...

None.gif Imports  System
None.gif
Imports  System.ComponentModel
None.gif
Imports  System.Collections
None.gif
Imports  System.Drawing
None.gif
Imports  System.Web
None.gif
Imports  System.Web.UI
None.gif
Imports  System.Web.UI.HtmlControls
None.gif
Imports  System.Web.UI.WebControls
None.gif
ExpandedBlockStart.gifContractedBlock.gif
Namespace hackate Namespace hackate
ExpandedSubBlockStart.gifContractedSubBlock.gif    
Public Class DropDownListColorClass DropDownListColor
InBlock.gif        
Inherits DropDownList
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
Protected Overrides Sub RenderContents()Sub RenderContents(ByVal writer As System.Web.UI.HtmlTextWriter)
InBlock.gif            
Dim collection1 As ListItemCollection = Me.Items
InBlock.gif            
Dim num1 As Integer = Me.Items.Count
InBlock.gif            
Dim flag1 As Boolean = False
InBlock.gif            
If (num1 > 0Then
InBlock.gif                
Dim num2 As Integer
InBlock.gif                
For num2 = 0 To num1 - 1
InBlock.gif                    
Dim item1 As ListItem = collection1.Item(num2)
InBlock.gif                    writer.WriteBeginTag(
"option")
InBlock.gif                    
If item1.Selected Then
InBlock.gif                        
If flag1 Then
InBlock.gif                            
Throw New HttpException("Cant_Multiselect_In_DropDownList")
InBlock.gif                        
End If
InBlock.gif                        flag1 
= True
InBlock.gif                        writer.WriteAttribute(
"selected""selected"False)
InBlock.gif                    
End If
InBlock.gif                    writer.WriteAttribute(
"value", item1.Value, True)
InBlock.gif                    
'Dim abCollection As System.ComponentModel.AttributeCollection = TypeDescriptor.GetAttributes(item1)
InBlock.gif
                    Dim ie As IEnumerator = item1.Attributes.Keys.GetEnumerator
InBlock.gif
InBlock.gif                    
Dim str2 As Object
InBlock.gif                    
Do While ie.MoveNext
InBlock.gif                        str2 
= ie.Current
InBlock.gif                        writer.WriteAttribute(str2.ToString, item1.Attributes.Item(str2.ToString))
InBlock.gif                    
Loop
InBlock.gif                    
'Dim itstyle As String = item1.Attributes.Item("style")
InBlock.gif
                    'writer.WriteAttribute("style", itstyle)
InBlock.gif
                    writer.Write(">"c)
InBlock.gif
InBlock.gif                    writer.
Write(item1.Text)
InBlock.gif                    writer.WriteEndTag(
"option")
InBlock.gif                    writer.
WriteLine()
InBlock.gif                
Next num2
InBlock.gif            
End If
ExpandedSubBlockEnd.gif        
End Sub

InBlock.gif
InBlock.gif        
'Public ReadOnly Property ItemStyles() As ArrayList
InBlock.gif
        '    Get
InBlock.gif
        '        If viewstate.Item("styles") Is Nothing Then viewstate.Item("styles") = New ArrayList
InBlock.gif
        '            Dim AR As ArrayList = viewstate.Item("styles")
InBlock.gif
        '            If AR.Count <> Items.Count Then
InBlock.gif
        '            For N As Integer = AR.Count + 1 To Items.Count
InBlock.gif
        '                AR.Add(New Style)
InBlock.gif
        '            Next
InBlock.gif
        '            viewstate.Item("styles") = AR
InBlock.gif
        '        Else
InBlock.gif
        '            viewstate.Item("styles") = AR
InBlock.gif
        '        End If
InBlock.gif
        '        Return AR
InBlock.gif
        '    End Get
InBlock.gif
        'End Property
InBlock.gif

ExpandedSubBlockStart.gifContractedSubBlock.gif        
Protected Overrides Sub LoadViewState()Sub LoadViewState(ByVal savedState As Object)
InBlock.gif            
Dim o As Object() = CType(savedState, Object())
InBlock.gif            
MyBase.LoadViewState(o(0))
InBlock.gif            
Dim list As ArrayList = CType(o(1), ArrayList)
InBlock.gif            
For i As Integer = 0 To list.Count - 1
InBlock.gif                
Dim hash As Hashtable = CType(list(i), Hashtable)
InBlock.gif                
For Each key As Object In hash.Keys
InBlock.gif                    Items(i).Attributes.Add(key.ToString, hash(key.ToString))
InBlock.gif                
Next
InBlock.gif            
Next
ExpandedSubBlockEnd.gif        
End Sub

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
Protected Overrides Function SaveViewState()Function SaveViewState() As Object
InBlock.gif            
Dim o(2As Object
InBlock.gif            o(
0= MyBase.SaveViewState
InBlock.gif            
Dim list As ArrayList = New ArrayList
InBlock.gif            o(
1= list
InBlock.gif            
For Each item As ListItem In Me.Items
InBlock.gif                
Dim hash As Hashtable = New Hashtable
InBlock.gif                
For Each key As Object In item.Attributes.Keys
InBlock.gif                    hash.Add(key, item.Attributes(key.ToString))
InBlock.gif                
Next
InBlock.gif                list.Add(hash)
InBlock.gif            
Next
InBlock.gif            
Return o
ExpandedSubBlockEnd.gif        
End Function

ExpandedSubBlockEnd.gif    
End Class

ExpandedBlockEnd.gif
End Namespace

None.gif

我知道大多都用C#开发的,我也附上一个C#的.
None.gif public   class  MyDrop :DropDownList
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        
protected override void RenderContents(HtmlTextWriter writer)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            ListItemCollection listItemCollection 
= base.Items;
InBlock.gif            
int i = base.Items.Count;
InBlock.gif            
bool flag = false;
InBlock.gif            
if (i > 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
for (int j = 0; j < i; j++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    ListItem listItem 
= listItemCollection[j];
InBlock.gif                    writer.WriteBeginTag(
"option");
InBlock.gif                    
if (listItem.Selected)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        
if (flag)
ExpandedSubBlockStart.gifContractedSubBlock.gif                        
dot.gif{
InBlock.gif                            
throw new HttpException("Cant_Multiselect_In_DropDownList");
ExpandedSubBlockEnd.gif                        }

InBlock.gif                        flag 
= true;
InBlock.gif                        writer.WriteAttribute(
"selected""selected"false);
InBlock.gif
InBlock.gif
ExpandedSubBlockEnd.gif                    }

InBlock.gif                    writer.WriteAttribute(
"value", listItem.Value, true);
InBlock.gif                    System.Web.UI.AttributeCollection attributeCollection 
= listItem.Attributes;
InBlock.gif                    IEnumerator iEnumerator 
= attributeCollection.Keys.GetEnumerator();
InBlock.gif                    
while (iEnumerator.MoveNext())
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        
string str2 = (String)iEnumerator.Current;
InBlock.gif                        writer.Write(
" "+str2+"=\""+attributeCollection[str2]+"\"");
ExpandedSubBlockEnd.gif                    }

InBlock.gif                    writer.Write(
'>');
InBlock.gif                    HttpUtility.HtmlEncode(listItem.Text, writer);
InBlock.gif                    writer.WriteEndTag(
"option");
InBlock.gif                    writer.WriteLine();
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
protected override object SaveViewState()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
object[] objs = new  object[2];
InBlock.gif            objs[
0]= base.SaveViewState ();
InBlock.gif            System.Collections.ArrayList list 
= new ArrayList();
InBlock.gif            objs[
1]= list;
InBlock.gif            
foreach(ListItem item in this.Items)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                System.Collections.Hashtable hash 
= new Hashtable();
InBlock.gif                
foreach(Object key in item.Attributes.Keys)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    hash.Add(key,item.Attributes[key.ToString()]);
ExpandedSubBlockEnd.gif                }

InBlock.gif                list.Add(hash);
ExpandedSubBlockEnd.gif            }

InBlock.gif            
return objs;
ExpandedSubBlockEnd.gif        }

InBlock.gif        
protected override void LoadViewState(object savedState)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
object[] objs = (Object[])savedState;
InBlock.gif            
base.LoadViewState (objs[0]);
InBlock.gif            System.Collections.ArrayList list 
= (System.Collections.ArrayList)objs[1];
InBlock.gif            
for(int i =0;i< list.Count;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                System.Collections.Hashtable hash 
= (System.Collections.Hashtable)list[i];
InBlock.gif                
foreach(object key in hash.Keys)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    Items[i].Attributes.Add(key.ToString(),hash[key].ToString());
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

InBlock.gif            
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif
InBlock.gif
ExpandedBlockEnd.gif    }

然后使用这个控件的时候只要
Dim item As New ListItem("苯苯", "bb")
            item.Attributes.Add("style", "color:#ffee39")
            item.Attributes.Add("onClick", "alert('你好')")
            ddl.Items.Add(item)
            item = New ListItem("超级", "cj")
            item.Attributes.Add("style", "color:#ff39ee")
            item.Attributes.Add("onclick", "alert('我好')")
            ddl.Items.Add(item)
这样则可!
=========================================
在CNBLOGS里有很多高手,如果代码有不足等请大家提出意见,如果有更好的解决方案,请多多提出,谢谢了.......

转载于:https://www.cnblogs.com/hackate/archive/2005/09/09/233166.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值