【提问-自定义控件】[100]当自定义集合作为属性的时候添加不进数据

crystal_lz 2012-10-30 04:11:06
很纠结的一个问题
自定义的集合作为控件的属性 然后控件添加到窗体上
属性窗口识别出来是集合 然后也能添加数据 可是程序一运行的时候 在设计时添加的数据就没有了
然后我跳到窗体自动生成的代码去看 压根就没有给我的属性赋值

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

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

上一个代码大概的图

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

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

再来看看自动生成的代码

// 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中添加的两个项自动生成的代码

// 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添加进去的
我不知道我哪里搞错了 或者说 还有哪里没有搞 所以我添加的数据压根就没有自动生成代码

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

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(); //重绘控件
}
}

然后这样是不行滴 木有用

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


我还发现一个纠结的问题

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

问题的关键在于我上面说的那些 怎么样才能添加数据的时候 让他自动生成代码把数据添加进去 不然在设计的时候 有数据程序一运行数据就没了、、
希望哪位遇到过类似的问题的 或者说 做过类似的东西的指点一下! 感激不尽...
我是非常相信 我是还有哪里没有弄....但是我不知道是哪里..
...全文
230 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
crystal_lz 2012-10-31
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

[Serializable]去掉就好了
[/Quote]
哎哟 我真心感谢
其实 最早在开始的时候 在集合问题都还没有解决之前 我是没有写 Serializable 的 可是修改属性的时候报错 说没有标记为可序列化 不过那个时候是直接用的list 还没有自定义集合
所以后来用自定义的集合的时候 也果断的加上了 Serializable 真没想到的是 最近的几次问题 都出在特性上面

真心感谢!、、
jshi123 2012-10-31
  • 打赏
  • 举报
回复
[Serializable]去掉就好了
crystal_lz 2012-10-31
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

你的ListItem怎么写的?
[/Quote]
我在测试的时候 ListItem 就随便写了两个属性在里面
真正的控件 还没有开始写 我只是在写控件前 把我可能会遇到的问题 实践一下
[Serializable]
public class ListItem{
public int ID{get; set;}
public string Name{get; set;}
}
jshi123 2012-10-30
  • 打赏
  • 举报
回复
你的ListItem怎么写的?
crystal_lz 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

有啊,怎么会没有,比如ListView.Items属性:
http://reflector.webtropy.com/default.aspx/DotNET/DotNET/8@0/untmp/whidbey/REDBITS/ndp/fx/src/WinForms/Managed/System/WinForms/ListView@cs/4/ListView@cs
第1008行
[/Quote]

好吧 仔细一看还真有
不过 可不可以 在问一下
怎么再能让它自动生成的代码能像 listview 那样 是 New 出来的 ListViewItem 对象 然后通过 AddRange 添加进去的
可是 我的现在虽然能自动生成代码 把设计时候的数据保存下来 虽然也同样是通过AddRange添加进去的 不过里面有些别扭

this.listControl1.Items.AddRange(new WindowsFormsControlLibrary6.ListItem[] {
((WindowsFormsControlLibrary6.ListItem)(resources.GetObject("listControl1.Items"))),
((WindowsFormsControlLibrary6.ListItem)(resources.GetObject("listControl1.Items1"))),
((WindowsFormsControlLibrary6.ListItem)(resources.GetObject("listControl1.Items2")))});

这个是listview的

System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem("");
System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem("");
System.Windows.Forms.ListViewItem listViewItem3 = new System.Windows.Forms.ListViewItem("");
this.listView1.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
listViewItem1,
listViewItem2,
listViewItem3});

明显感觉 listview 的看着要爽点、、、
XBodhi. 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 2 楼 的回复:

在集合属性上要打上持久化标签才能保存住设计视图:
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ListItemCollection Items {
get { ..
同意。
[/Quote]

学习了。
快溜 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

在集合属性上要打上持久化标签才能保存住设计视图:
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ListItemCollection Items {
get { ..
[/Quote]同意。
crystal_lz 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

在集合属性上要打上持久化标签才能保存住设计视图:
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ListItemCollection Items {
get { ..
[/Quote]
哎哟 尼玛 干净利落 直击要害
不过 貌似 在 .Net 的源码中并没有看到上面这个特性 只有[Editor("System........"),typeof(UITypEditor)]设计器的

话又说回来 至少解决了 现在的问题 果断给分结贴
jshi123 2012-10-30
  • 打赏
  • 举报
回复
在集合属性上要打上持久化标签才能保存住设计视图:
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ListItemCollection Items {
get { ..
crystal_lz 2012-10-30
  • 打赏
  • 举报
回复
- -!、、、用Reflector观察了 .Net 的源码两天了 都还没有搞出来 真是悲剧
不过只看了一点 一个完整的控件代码太多了 ListView 的源码 就近8000行......果断吓着了

我非常不明白的是 我那个继承的List的和直接的List的有啥区别 可是 为什么出来的效果完全不一样!

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧