简单升级了一下可着色的ListBox控件
发布日期:2021-08-25 00:12:06 浏览次数:1 分类:技术文章

本文共 2070 字,大约阅读时间需要 6 分钟。

记得去年年初的时候做了一个控件。当时考虑的因数很少,虽然那个控件实现了简单的调用接口,可是有一个致命的问题是居然没有考虑到PostBack后的状态保存问题emcrook.gif

    新的ColorableListBox解决了控件被PostBack后的状态保存。实现过程很简单,就是把ListItem的ForeColor和BackColor信息存在ViewState里面,自己在控件中去维护。这个功能本来是很简单的,可是在做完后发现也仍然并不完美,因为目前还是不能处理条目移动的问题,如果条目被移动,比如有删除和插入等操作等,ListItem的颜色不能同步。目前的处理办法是如果有ListItem的变动,就清空所有的色彩信息。

    执行流程,在控件的OnPerRender事件运触发时,判断ListBox的Item的Attributes.CssStyle属性里是否被设置了color和background-color属性。如果有就记录下其属性值,然后保存在ViewState里,PostBack后从ViewState里恢复Item的属性值,在Render事件里,使用自己保存的属性信息来修改<option ...>...</option>的css属性。 

None.gif
protected 
override 
void OnPreRender(EventArgs e)
ExpandedBlockStart.gif{
InBlock.gif    
if ( m_IsClear )
ExpandedSubBlockStart.gif    {
InBlock.gif        m_ItemStyles = 
null;
ExpandedSubBlockEnd.gif    }
InBlock.gif
InBlock.gif    ArrayList alstStyle = 
null;
InBlock.gif    Hashtable htItemStyles = 
null;
InBlock.gif
InBlock.gif    
for
int i=0 ; i < 
this.Items.Count ; ++i )
ExpandedSubBlockStart.gif    {
InBlock.gif        
if ( alstStyle != 
null )
ExpandedSubBlockStart.gif        {
InBlock.gif            alstStyle.Clear();
ExpandedSubBlockEnd.gif        }
InBlock.gif        
foreach
string key 
in 
this.Items[i].Attributes.CssStyle.Keys )
ExpandedSubBlockStart.gif        {
InBlock.gif            
if ( htItemStyles == 
null )
ExpandedSubBlockStart.gif            {
InBlock.gif                htItemStyles = 
new Hashtable();
ExpandedSubBlockEnd.gif            }
InBlock.gif            
if ( m_ItemStyles != 
null )
ExpandedSubBlockStart.gif            {
InBlock.gif                
foreach
object obj 
in m_ItemStyles )
ExpandedSubBlockStart.gif                {
InBlock.gif                    
object [] objs = (
object [])obj;
InBlock.gif                    htItemStyles[objs[0]] = objs[1];
ExpandedSubBlockEnd.gif                }
ExpandedSubBlockEnd.gif            }
InBlock.gif            
if ( alstStyle == 
null )
ExpandedSubBlockStart.gif            {
InBlock.gif                alstStyle = 
new ArrayList();
ExpandedSubBlockEnd.gif            }
InBlock.gif            
string strKey = key.ToLower();
InBlock.gif            
if ( strKey == "color" || strKey == "background-color" )
ExpandedSubBlockStart.gif            {
InBlock.gif                alstStyle.Add(key + ':' + 
this.Items[i].Attributes.CssStyle[key]);
InBlock.gif                
continue;
ExpandedSubBlockEnd.gif            }
ExpandedSubBlockEnd.gif        }
InBlock.gif        
if ( alstStyle != 
null && alstStyle.Count > 0 )
ExpandedSubBlockStart.gif        {
InBlock.gif            
string [] strAry = 
new 
string[alstStyle.Count];
InBlock.gif            alstStyle.CopyTo(strAry);
InBlock.gif            htItemStyles[i] = strAry;
ExpandedSubBlockEnd.gif        }            
ExpandedSubBlockEnd.gif    }
InBlock.gif    
if ( htItemStyles != 
null )
ExpandedSubBlockStart.gif    {
InBlock.gif        
int count = 0;
InBlock.gif        m_ItemStyles = 
new 
object[htItemStyles.Count];
InBlock.gif        
foreach
object key 
in htItemStyles.Keys )
ExpandedSubBlockStart.gif        {
InBlock.gif            
object [] objects = 
new 
object[2];
InBlock.gif            objects[0] = key;
InBlock.gif            objects[1] = (
string [])htItemStyles[key];
InBlock.gif            m_ItemStyles[count++] = objects;
ExpandedSubBlockEnd.gif        }
ExpandedSubBlockEnd.gif    }
InBlock.gif    
base.OnPreRender(e);
ExpandedBlockEnd.gif}
None.gif
    控件的使用方法为:
None.gif ColorableListBox clb = 
new ColorableListBox();
None.gif ListItem li = 
new ListItem(name, value);
None.gif li.Attributes.CssStyle.Add("color", "yellow");
None.gif li.Attributes.CssStyle.Add("background-color", "blue");
None.gif clb.Items.Add(li);
    如果重新设置条目后(比如有Insert和Delete操作等)需要调用一下:ClearItemStyles();
ContractedBlock.gif
附ColorableListBox控件源码

本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

转载地址:https://blog.csdn.net/weixin_33836223/article/details/90197236 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:精度计算-大数乘小数
下一篇:Linux kernel Makefile for ctags

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月22日 03时22分29秒