zoukankan      html  css  js  c++  java
  • 微软就应该是咱最好的老师!

    谁都知道System.Windows.Forms命名空间下的ListControl类有两个这样的属性:

    ListControl.DisplayMember  和 ListControl.ValueMember 。

    这两个属性用来指定listControl绑定的对象中的什么属性用于它的显示,对象中的什么属性用于它的value值。

    最常用的方式当然是指定ListControl的DataSource到如从数据来的table;或者构建的 List<object>,然后指定这DisplayMember供用户使用,指定其ValueMember 供程序使用。

    从listControl继承来的控件就很多了,如ListBox,ComboBox等等,这些控件都能提供绑定到对象集合的功能。DisplayMember和ValueMember构成了一个键值对的关系,我们在应该中也经常只需要绑定到只有键和值的对象上,当然这里的键通常就是字符串或者数字,而值却可以是各种object对象了。

    今天这里要说的不是这个控件的使用,而是想说如何跟微软学习的问题。

    很简单的应用,就是让ComBoBox绑定到一个键值的对对象集合上,通过Dislay的值,得到其Value。

    KeyValuePair<(Of <(TKey, TValue>)>) Generic Structure ,系统提供了一个keyValuePair的泛型类型,没错,可以用上它了。的却,只用于绑定和选择操作是完全ok的,但是应为ComBoBox的Item是object类型的,不是一个确定类型的东东,把KeyValuePair的Structure绑定上去之后,就没法对其进行逆操作了,知道选择的Item,但是不能操作Item,Item不能转换到KeyValuePair的Structure,对象不能as为结构体。

    这就是问题,系统给提供的KeyValuePair的Structure 不能用于绑定后进行操作了,比如我们要比较Item的value。这就逼迫我们绑定到控件的必须是对象,这样就可以进行Item as Class的操作了。

    我们发现只要创建一个和KeyValuePair<(Of <(TKey, TValue>)>) Generic Structure结构完全一样的类就可以满足我们的需求了。

    接下来就是写代码了,怎么创建这个泛型类呢?代码怎么写呢?

    简单,我们抄袭微软的代码,或者说跟微软学习加就好了。

    用reflector来查看下KeyValuePair<(Of <(TKey, TValue>)>) Generic Structure的代码,直接把Structure改成class不就ok了。

     

    我们把代码copy出来,改成class,如下:

    代码
    public Class KeyValuePair<TKey, TValue>
    {
        
    private TKey key;
        
    private TValue value;
        
    public KeyValuePair(TKey key, TValue value)
        {
            
    this.key = key;
            
    this.value = value;
        }

        
    public TKey Key
        {
            
    get
            {
                
    return this.key;
            }
        }
        
    public TValue Value
        {
            
    get
            {
                
    return this.value;
            }
        }
        
    public override string ToString()
        {
            StringBuilder builder 
    = new StringBuilder();
            builder.Append(
    '[');
            
    if (this.Key != null)
            {
                builder.Append(
    this.Key.ToString());
            }
            builder.Append(
    "");
            
    if (this.Value != null)
            {
                builder.Append(
    this.Value.ToString());
            }
            builder.Append(
    ']');
            
    return builder.ToString();
        }
    }

     有需要的话,改改ToString方法,就over了,这样就完成这个键值对的类的创建了。怎么样?这样的代码质量如何,这样的代码写起来快吧,这样的代码可读性好吧。哈哈,没事还是多多选择跟微软学习,不要苦苦追寻什么高人了,高人就在身边。

    下面看看怎么用这个东东了。

    加入我们需要在ComBoBox的selectIndexChange事件里检测选择的项目的Value是否是预期想要的。

    代码
                //
                 class ClassA
                {
                    
    private string name;
                    
    public string Name;
                    
    public ClassA(string name)
                    {
                        
    this.Name = name;
                    }
                }

         
                ComboBox cbx 
    =new ComboBox();
                cbx.DataSource 
    =List<KeyValuePair<string,ClassA>>()
                {
                    
    new KeyValuePair<string, ClassA>(1new ClassA("abc1"));
                    
    new KeyValuePair<string, ClassA>(1new ClassA("abc2"));
                    
    new KeyValuePair<string, ClassA>(1new ClassA("abc3"));
                    
    new KeyValuePair<string, ClassA>(1new ClassA("abc4"));
                    
    new KeyValuePair<string, ClassA>(1new ClassA("abc5"));
                }
               cbx.DisplayMember 
    ="key";
               cbx.ValueMember 
    ="value";
               cbx.SelectedIndexChanged 
    += cbx_SelectedIndexChanged;
             
    private void cbx_SelectedIndexChanged(object sender, EventArgs e)
            {
              KeyValuePair
    <string,ClassA> obj = cbx.SelectedItem as KeyValuePair<string,ClassA>;//自定义的class:keyValuePair
            if(obj.Value.Name=="abc1")
             MessageBox.show(
    "ok");

            }
  • 相关阅读:
    Java数据类型转换(自动转换和强制转换)
    Java数据类型以及变量的定义
    Java8新特性_日期时间新类 LocalDate、LocalTime、LocalDateTime
    Java8新特性_接口中的默认方法
    java8 新特性 Optional容器类
    Java8新特性 并行流与串行流 Fork Join
    Java8新特性_stream API 练习
    IDEA导入JUnit4
    Reduce:规约;Collector:收集、判断性终止函数、组函数、分组、分区
    【Linux】排序命令sort
  • 原文地址:https://www.cnblogs.com/buaaboyi/p/1890482.html
Copyright © 2011-2022 走看看