问题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);
}
实际情况可能要复杂一些,需要作更多的控制或判断。随意说两句,疏漏或错误之处难免,谨请原谅。
但你可以利用 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);
}
实际情况可能要复杂一些,需要作更多的控制或判断。随意说两句,疏漏或错误之处难免,谨请原谅。
{
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]);
}
}
}
set
类型一样的就可以了。
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都不要用了,因为本身的集合就有序列化。于是出现了新的问题,如果我不去重写子控件,能否在自定义控件里得到这个集合被更改的消息。
/// 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()又应该如何处理呢?