问题1的答案其实你已知道了:不能对 ListView 的 Columns 属性赋值。
但你可以利用 Columns 集合的Add,Remove,Insert等方法进行ListView的列控制。
不过,我提醒你,在进行以上操作前有必要先清空 ListView 的ListViewItems集合中的数据,待列重新设置完后,再逐一重新“正确地”添加。通过自定义控件公开子控件的方法、事件、属性的方法有很多,最简单的可能也是最弊脚的方法是将子控件的修饰符改为 public 或 internal,建议创建类似于以下的一个属性。
  public ListView ListView
  {
     get
     {
        return this.listView1;
     }
  }
不过此方法,挺“瘦”的。比较合理的方法是依旧保持控件实例的修饰符为 private,为要公开的子控件事件、属性、方法分别创建一些对应的事件、属性、方法。
如下所示:
    假设有一子控件名为 subControl, 其有一使用 EventHandler 定义的事件 Click。
   // 子控件
   private Control subControl;   // 初始化
   ...
   // 为子控件绑定事件处理
   this.subControl.Click += new EventHandler(this.OnClickSubControl);
   // 定义对外公开的事件
   public event EventHandler ClickOnSubControl;
   // 针对子控件的事件处理,同时对外引发相应的事件。
   protected virtual void OnClickOnSubControl(object sender, EventArgs e)
   {
      if (this.ClickOnSubControl != null)
        ClickOnSubControl(sender, e);   //依旧传递子控件作为事件源对象
      //也可 ClickOnSubControl(this, e);传递自定义控件作为事件源对象
   }公开子控件方法、属性就更简单了,仅仅是简单的模仿即可。  public void SubControlMethodA(object o)
  {
    if (this.subControl != null)
       this.subControl.MethodA(o);
  }
实际情况可能要复杂一些,需要作更多的控制或判断。随意说两句,疏漏或错误之处难免,谨请原谅。

解决方案 »

  1.   

    public ArrayList PictureFiles
    {
    get
    {
    return this.arrayPictureFiles;
    }
    set
    {
    this.arrayPictureFiles.Clear();
    if(value == null )
    {
    return;
    } int count = value.Count;
    for(int i=0;i<count;i++)
    {
    this.arrayPictureFiles.Add(value[i]);
    }
    }
    }
      

  2.   

    get
    set
    类型一样的就可以了。
      

  3.   

    还是第二个问题public ListView.ColumnHeaderCollection Columns,这个值对应的是(Collection)改不改变列表头,都不会引发set的,楼上的不信可以去试试...
      

  4.   

    [Description列名"),Category("Behavior"),
    DesignerSerializationVisibility(DesignerSerializationVisibility.Content), 
    EditorAttribute(typeof(System.ComponentModel.Design.CollectionEditor), typeof(System.Drawing.Design.UITypeEditor)),
    DefaultValue(null)]
    public ListView1.ColumnHeaderCollection Columns
    {
      get
      {
        return listView1.Columns;
      }
    }问题解决,要在前面加上
    DesignerSerializationVisibility(DesignerSerializationVisibility.Content), 
    EditorAttribute(typeof(System.ComponentModel.Design.CollectionEditor), typeof(System.Drawing.Design.UITypeEditor)),连Set都不要用了,因为本身的集合就有序列化。于是出现了新的问题,如果我不去重写子控件,能否在自定义控件里得到这个集合被更改的消息。
      

  5.   

    http://expert.csdn.net/Expert/topic/2386/2386766.xml?temp=.0481531大家看看我的问题.
      

  6.   

    我重写了Items的封装类,已经可以处理ListViewItemCollection下Add之类的操作,但是对于SubItems没有办法,无法重载,有人帮我看看吗?/// <summary>
    /// ListViewItemCollectionEx 的摘要说明。
    /// </summary>
    public class ListViewItemCollectionEx : System.Windows.Forms.ListView.ListViewItemCollectionpublic delegate void ListViewAddItem(ListViewItem item);
    public event ListViewAddItem AddedItem; private ListView parent;
    public ListViewItemCollectionEx(System.Windows.Forms.ListView owner):base(owner)
    {
      parent = owner;
    }public new void Add(ListViewItem item)
    {
      AddedItem(item);
      base.Add(item);
    }以上完成了在ListView.Items.Add()添加新项的消息处理但是如果是ListView.Items[i].SubItems.Add()又应该如何处理呢?