zoukankan      html  css  js  c++  java
  • c#中的多列列表框

    介绍 当我第一次开始使用。net时,我对列表框和列表框都很失望 ComboBox没有多列支持。更准确地说,列表框并没有按照我期望的方式实现它(每个条目水平堆放而不是垂直堆放)。我听说Windows窗体有一组丰富的控件,但它们没有微软窗体2.0 (Office VBA使用的ActiveX库)那么多的功能。然而,现在我已经使用了。net和Windows窗体,我很高兴MS开发人员花了更少的时间来编写花哨的控件,而花了更多的时间来让其他人更容易这样做。 这是从System.Windows.Forms.ListBox继承的一个所有者绘制的列表框。它的主要功能是将每个项格式化为多个列。其次,客户应该能够 轻松检索任何行中任何列的内容。我决定做这个最好的方法是模仿标准的绘图 DataGrid。这样做的副作用是它必须绑定到数据源。 特性 具有可配置宽度的多列 基于列的#和它们的宽度自动计算水平范围 属性来快速限制列的#,而不修改 数据源 2 .新事件,隐藏复制CodeMeasureSubItem并隐藏为客户端代码复制CodeDrawSubItem以获取绘制的所有权 ValueMember现在对应于多olumnlistbox。值(而不是文本)。也是一个 TextMember属性已经被添加,它对应于MultiColumnListBox.Text 可以设置ValueIndex和TextIndex属性,以便使用列位置而不是列名 MatchEntryStyle枚举属性扩展类型化字符匹配,以区分大小写和完成字符串匹配(带有可配置的超时) FindString()和FindStringExact()将列考虑在内。 GetItemAt()方法快速获取指定行和列中的对象(4个重载) 反射用于确定是否可以将对象绘制成图像。这包括图像位图和隐藏。复制Codebyte [] (如果它真的是一个图像的话) 包括一个带有单个静态方法ToDataSet的helper对象数据数组 它将1-3维(非锯齿)数组转换为数据集。 使用 隐藏,收缩,复制Code

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Data;
    using AsYetUnnamed;
    
    public class Form1 : System.Windows.Forms.Form
    {
        private DataSet ds;
        private MultiColumnListBox listBox1;
        public Form1()
        {
            ds = DataArray.ToDataSet(new object[,]{ 
                        {"Row0, col0",  "Row0, col1" ,1},
                        {"Row00, col0", "Row1, col1" ,new object()},
                        {"Row1, col0",  "Row2, col1" ,"Some String"},
                        {"Row1a, col0", "Row3, col1" ,Rectangle.Empty},
                        {"row1aa,col0", "Row4, col1" ,1},
                        {"row0, col0",  "Row5, col1" ,1},
                        {"pow0, col0",  "Row6, col1" ,1},
                        {"Row7, col0",  "Row7, col1" ,new ExampleClass()},
                        {"Row8, col0",  "Row8, col1" ,Image.FromFile("StopLight.gif")}
                        });
                
            listBox1 = new MultiColumnListBox();
            listBox1.Parent = this;
    
            listBox1.DataSource = arr;            
        }
        class ExampleClass
        {
            Public override string ToString()
            {
                return "Hello from ExampleClass!!";
            }
        }
    
    }

    将产生类似于上面的截图。演示项目演示了更多特性。 挑战 可能最大的挑战是弄清楚在WinForms上如何进行复杂的数据绑定。结果是,任何实现了IList的东西都被枚举以获得行列表。ListBox与DataGrid的区别如下: ListBox:对IList中包含的每个项调用oString()。如果DisplayMember被设置,它会调用IList[index].DisplayMember.ToString() 方法中包含的每个项都调用ToString() 它使用反射来查找对象公开的每个公共可读属性。它在一个列中显示这些内容。 但是,如果数据源隐含了ITypedList,则它使用由 ITypedList代替。当与包含ICustomTypeDescriptor的对象一起使用时, 可以为对象提供不存在的属性 DataGrid。幸运的是数据集,或者说是DataView对象 为你实现这个。ListBox已经提供的DataManager能够自动查询这些接口。 另一件烦人的事情是使用SelectionMode.MultiExtended。在此模式下,在一个已经选中但没有焦点的项目上设置SelectedIndex将不会给该项目聚焦。此外,在多扩展模式下调用ClearSelected()清除选择,然后选择项目0。我花了好几个小时试图弄清楚如何设置一个互斥选择,而不强制重新绘制,也不闪烁项目0。 \ \待办事项: 这绝对是一个正在进行的工作。除了没有设计代码,缺乏文档,严重缺乏代码注释,以及太多我想吃掉的异常 实现如下: 用列样式替换列宽度,列样式除了宽度还指定 字体,颜色,背景色,甚至一个委托来执行单列绘制,而不需要完全扩展OwnerDraw。 对基于鼠标的列调整有什么想法吗?这是否超出了列表框的用途? todataset()我想实际创建一个对象 实现ITypedList和ICustomTypeDesriptor,它们解释对包含数组的调用,而不仅仅是循环遍历和复制元素到 数据集。 我真的需要一个命名空间… 结论 希望这能满足别人的需要,而不仅仅是我自己的…我非常感谢任何反馈、评论、建议、bug发现等等。 本文转载于:http://www.diyabc.com/frontweb/news231.html

  • 相关阅读:
    Spring Boot自动配置
    Servlet、JSP总结(1)
    Spring MVC
    Springboot中的数据库事务
    数据库访问
    AOP
    全注解下的IOC
    spring boot入门
    安卓工程化开发笔记(2)
    2048功能说明模板
  • 原文地址:https://www.cnblogs.com/Dincat/p/13431173.html
Copyright © 2011-2022 走看看