linq 解决winForm中控件CheckedListBox操作的问题。

最近有幸被邀做winForm的开发,发现checkedListBox在操作中有几个不方便的地方,自己的解决办法,也许是自己不太熟悉其使用,没有找到更好的操作方式。

 

1.获取CheckedListBox选中项的文本的字符串,并用分隔符连接。系统没有提供相应的属性,方法。

这里我们利用3.0的特性给其来个扩展方法,如下:

         public   static   string  GetCheckedItemsText( this  CheckedListBox box)
        {
            
string  result  =  box.CheckedItems.Cast < object > ().Aggregate( string .Empty, (current, checkedItem)  =>  current  +  (box.GetItemText(checkedItem)  +   " / " ));
            
if  (result.Length  >   0 ) result  =  result.TrimEnd( new   char [] { ' / ' });
            
return  result;
        }

 

分隔符这个可以放如参数中,更灵活的变化分隔符。

2.在得知CheckedListBox绑定list对象的某个属性的集合之后来选中list中的项目。如问题1中,返回的字符串,在得到字符串后如何初始化选中状态。

 

ExpandedBlockStart.gif 代码
        public   static   void  SetCheckedItmsByNames( this  CheckedListBox box,  string [] names)
        {
            
for  ( int  i  =   0 ; i  <  box.Items.Count;i ++  )
            {
                
foreach  ( string  name  in  names)
                {
                    
if  (box.GetItemText(box.Items[i])  ==  name)
                    {
                        box.SetItemChecked(i, 
true );
                    }
                }
            }
        }

        
public   static   void  SetCheckedItmsByNames( this  CheckedListBox box,  string  names)
        {
            
if ( string .IsNullOrEmpty(names))  return ;
            
string [] name  =  names.Split( new   char [] { ' / ' });
            SetCheckedItmsByNames(box,name);
        }
 
3. 当得到了选择项目的字符串获取id串,反之亦ok的方法:
// 已知names,取ids
ids  =  ComFunction.GetNamesOrIdsFromIEnumerable(ChcckedListBox.DataSource  as  IEnumerable < b_station > ,
                                    (w, s) 
=>  w.name.ToString()  ==  s  ?  w.id.ToString() :  string .Empty,
                    names);

// 已知ids,取names
ids  =  ComFunction.GetNamesOrIdsFromIEnumerable(ChcckedListBox.DataSource  as  IEnumerable < b_station > ,
                                    (w, s) 
=>  w.id.ToString()  ==  s  ?  w.name.ToString() :  string .Empty,
                    names);

 

 实现方法如下:

 

         public    static   string  GetNamesOrIdsFromIEnumerable < T > (IEnumerable < T >  list,Func < T, string , string >  func, string  ids)
        {
            
string  result  =   string .Empty;
            
if  ( string .IsNullOrEmpty(ids) || list == null )
                
return  result;
            
string [] id  =  ids.Split( new []{ ' / ' });
            
foreach  ( string  s  in  id)
            {
                
string  temp;
                
foreach  (T model  in  list)
                {
                    temp  
=  func(model, s);
                    
if  ( string .IsNullOrEmpty(temp))  continue ;
                    result 
+=   string .Format( " {0}/ " , temp);
                    
break ;
                }
            }
            
if  (result.Length  >   0 )
                result 
=  result.TrimEnd( new [] { ' / ' });
            
return   result;
        }

 

通过遍历ids对应的元素和list集合中的元素利用func方法进行比较确认是否符合要求,取得结果。当时主要是很多类型的对象集合需要绑定到CheckedListBox进行操作,而设计的时候又有很多ids,或者names,或者有其一。乱啊。

这次开发主要负责代码实现,没有参与需求和设计,写代码的心思就多了,所以对其他的控件也有提炼了比较多的通用方法和封装(如combobox的搜索效果,支持模糊匹配,like ‘%word%’)等。下回见!

 

转载于:https://www.cnblogs.com/buaaboyi/archive/2010/12/21/1913245.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值