日期:2014-05-17  浏览次数:20925 次

【提问-自定义控件】[100]当自定义集合作为属性的时候添加不进数据
很纠结的一个问题
自定义的集合作为控件的属性 然后控件添加到窗体上
属性窗口识别出来是集合 然后也能添加数据 可是程序一运行的时候 在设计时添加的数据就没有了
然后我跳到窗体自动生成的代码去看 压根就没有给我的属性赋值

然后我又果断继承 List<> 还是无果在设计时能添加数据 程序一运行就没有
跳到自动生成的代码 貌似多了点东西但是还是没有给属性赋值

后来干脆直接 用 List<> 作为属性 oh yeah 一切正常了 数据能添加进去了(不过自动生成的代码很丑陋)
可是 现在的情况是不容直接使用 List<> 作为属性 因为控件中 我添加一个子项我要重绘一下控件
所以要在 Add Remove RemoveAt Clear....方法里面动动手脚

上一个代码大概的图

在图片中可以看到 我有三个属性 分别是我 自定义的集合 继承的List<>的 和 直接就是List<>的
然后我分别给这三个属性各添加了两个项

但是最终数据保存下来了的只有直接使用的List<>作为属性的ItemsList

再来看看自动生成的代码
C# code

// listControl1
// 
this.listControl1.BackColor = System.Drawing.Color.Black;
new ListControl.ItemCollection().Add(((ListItem)(resources.GetObject("listControl1.ItemsExtendList"))));
new ListControl.ItemCollection().Add(((ListItem)(resources.GetObject("listControl1.ItemsExtendList1"))));
this.listControl1.ItemsList = ((System.Collections.Generic.List<ListItem>)(resources.GetObject("listControl1.ItemsList")));
this.listControl1.Location = new System.Drawing.Point(97, 12);
this.listControl1.Name = "listControl1";
this.listControl1.Size = new System.Drawing.Size(75, 23);
this.listControl1.TabIndex = 0;
this.listControl1.Text = "listControl1";


从上面的代码中可以看出直接使用的List<>作为属性的ItemsList是被复制了的 而上面的两句则是为继承的List<>的ItemsExtendList生成的 但是却没有给ItemsExtendList属性赋值 然后我自定义的集合则直接果断的没有
再来看看我在ListView中添加的两个项自动生成的代码
C# code

// listView1
// 
System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem("11");
System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem("12");
this.listView1.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
listViewItem1,
listViewItem2});
this.listView1.Location = new System.Drawing.Point(66, 62);
this.listView1.Name = "listView1";
this.listView1.Size = new System.Drawing.Size(121, 97);
this.listView1.TabIndex = 1;
this.listView1.UseCompatibleStateImageBehavior = false;


明显创建了两个项然后通过AddRange添加进去的
我不知道我哪里搞错了 或者说 还有哪里没有搞 所以我添加的数据压根就没有自动生成代码

现在不知道这个东西要怎么解决 我要用自定义的集合因为
C# code

public void Add(ListItem item) {
    this.EnsureSpace(1);
    int index = this.IndexOf(item);
    if (index == -1) {
        this.m_arrItems[this.count++] = item;
        this.owner.Invalidate();    //重绘控件
    }
}


然后这样是不行滴 木有用
C# code

public List<ListItem> ItemsList {
    get {
        if (itemsList == null)
            itemsList = new List<ListItem>();
        return itemsList;
    }
    set { itemsList = value; this.Invalidate(); }
}



我还发现一个纠结的问题

点击Add的时候控件界面上能呈现反应 但是点击Remove的时候界面上却没有重绘 我也非常确信 我代码里有重绘代码
然后我用ListView试了一下 结果 ListView 也是这样的 不知道是我的VS问题 还是天生的...- -!、、、呃 这个都是次要的 至少不只是我的控件是这样的 

问题的关键在于我上面说的那些 怎么样才能添加数据的时候 让他自动生成代码把数据添加进去 不然在设计的时候 有数据程序一运行数据就没了、、
希望哪位遇到过类似的问题的 或者说 做过类似的东西的指点一下! 感激不尽...
我是非常相信 我是还有哪里没有弄....但是我不知道是哪里..

------解决方案--------------------
在集合属性上要打上持久化标签才能保存住设计视图:
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ListItemCollection Items {
get { ..
------解决方案--------------------
探讨

在集合属性上要打上持久化标签才能保存住设计