简单升级了一下可着色的ListBox控件

简介:

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

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

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

protected  override  void OnPreRender(EventArgs e)
{
     if ( m_IsClear )
    {
        m_ItemStyles =  null;
    }

    ArrayList alstStyle =  null;
    Hashtable htItemStyles =  null;

     forint i=0 ; i <  this.Items.Count ; ++i )
    {
         if ( alstStyle !=  null )
        {
            alstStyle.Clear();
        }
         foreachstring key  in  this.Items[i].Attributes.CssStyle.Keys )
        {
             if ( htItemStyles ==  null )
            {
                htItemStyles =  new Hashtable();
            }
             if ( m_ItemStyles !=  null )
            {
                 foreachobject obj  in m_ItemStyles )
                {
                     object [] objs = ( object [])obj;
                    htItemStyles[objs[0]] = objs[1];
                }
            }
             if ( alstStyle ==  null )
            {
                alstStyle =  new ArrayList();
            }
             string strKey = key.ToLower();
             if ( strKey == "color" || strKey == "background-color" )
            {
                alstStyle.Add(key + ':' +  this.Items[i].Attributes.CssStyle[key]);
                 continue;
            }
        }
         if ( alstStyle !=  null && alstStyle.Count > 0 )
        {
             string [] strAry =  new  string[alstStyle.Count];
            alstStyle.CopyTo(strAry);
            htItemStyles[i] = strAry;
        }            
    }
     if ( htItemStyles !=  null )
    {
         int count = 0;
        m_ItemStyles =  new  object[htItemStyles.Count];
         foreachobject key  in htItemStyles.Keys )
        {
             object [] objects =  new  object[2];
            objects[0] = key;
            objects[1] = ( string [])htItemStyles[key];
            m_ItemStyles[count++] = objects;
        }
    }
     base.OnPreRender(e);
}

    控件的使用方法为:
 ColorableListBox clb =  new ColorableListBox();
 ListItem li =  new ListItem(name, value);
 li.Attributes.CssStyle.Add("color", "yellow");
 li.Attributes.CssStyle.Add("background-color", "blue");
 clb.Items.Add(li);
    如果重新设置条目后(比如有Insert和Delete操作等)需要调用一下:ClearItemStyles();

附ColorableListBox控件源码

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

目录
相关文章
|
算法 Windows
Winform控件优化之实现无锯齿的圆角窗体(或任意图形的无锯齿丝滑的窗体或控件)【借助LayeredWindow】
在一般能搜到的所有实现圆角窗体的示例中,都有着惨不忍睹的锯齿...而借助于Layered Windows,是可以实现丝滑无锯齿效果的Form窗体的,其具体原理就是分层窗体....
1658 0
Winform控件优化之实现无锯齿的圆角窗体(或任意图形的无锯齿丝滑的窗体或控件)【借助LayeredWindow】
|
3月前
|
存储 搜索推荐 C#
WPF/C#:让绘制的图形可以被选中并将信息显示在ListBox中
WPF/C#:让绘制的图形可以被选中并将信息显示在ListBox中
43 0
|
6月前
|
索引
[Qt5&控件] 下拉框ComBoBox和层叠窗口StackedWidget控件组合使用
[Qt5&控件] 下拉框ComBoBox和层叠窗口StackedWidget控件组合使用
153 0
WPF-样式问题-处理ListBox、ListView子项内容全填充问题
WPF-样式问题-处理ListBox、ListView子项内容全填充问题
230 0
WPF-样式问题-ListBox或ListView中子项全填充去除边线问题
WPF-样式问题-ListBox或ListView中子项全填充去除边线问题
185 0
|
C#
WPF 创建无边框的圆角窗口
原文:WPF 创建无边框的圆角窗口 如题所述,在WPF中要创建一个没有边框且为圆角的窗体,有如下几步工作要进行: 第一步:去掉窗体默认样式的边框 首先将窗体的背景设为透明,将允许透明的属性设置为True,...
2704 0
|
测试技术 C#
WPF 设置控件阴影后,引发的Y轴位置变化问题
原文:WPF 设置控件阴影后,引发的Y轴位置变化问题 背景 最近遇到一个动画执行时,文本位置变化的问题。如下图: 如果你仔细看的话,当星星变小时,文本往下降了几个像素。 貌似有点莫名其妙,因为控件之间并不在同一个Panel布局控件中,不存在高度限制变化引发此类问题。
1053 0
|
C#
WPF圆角按钮与触发颜色变化
原文:WPF圆角按钮与触发颜色变化 ...
1588 0
|
图形学
控件渐变色的实现
控件渐变色的实现(一)—— CAGradientLayer实现控件渐变色的实现(二)—— Core Graphics实现
785 0
|
C#
WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条)
原文:WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条) 对于TreeView而言: TreeViewAutomationPeer lvap = new TreeViewAuto...
2399 0