c# 关于LISTBOX的添加项的问题 以及不重复插入
2007-12-05 17:36
459 查看
我以前没有用过windows form上的东西,web上很简单,html的标签支持元素的value属性。我使用过delphi的combox和listbox,它的items是个stringList类型的东西,每个元素是一个字符串,同时能保存一个object;使用的时候往往定义个object的子类型,然后添加到items时new一个这种对象,最后还要管理这个对象的释放.
那么打开msdn看看windows form上的listbox吧
经过研究猜想是这样:
ListBox.Items 的类型是ListBox.ObjectCollection类型
他的add函数参数是一个object,而不是string
那么按理说,一个元素类型是object,那么系统显示这个元素的时候自然需要ToString()
所以也许可以这样做:
在窗口内写一个小类,继承自object
包含两个string的数据成员
一个是名字,一个是id
然后重载基类object的函数Tostring()
让这个小类的tostring 函数return name;
定义好这个类以后,
当添加记录到列表框的时候,
new 一个小类的对象
把名字和id赋值到两个成员
然后listbox1.items.add(yourObj);
这样大概就行了
然后在使用的时候
obj=Listbox1.selected......
obj.id .....
代码:
-------------------------------------------------------------
///
/// 列表框元素对象
///
///
public class MyItem : object
{
public string name;
public string id;
public override string ToString()
{
// TODO: 添加 MyItem.ToString 实现
return name;
}
}
----------------------------------------------------
private void Form1_Load(object sender, System.EventArgs e)
{
MyItem item1=new MyItem();
item1.id="001";
item1.name="天下";
this.listBox1.Items.Add(item1);
MyItem item2=new MyItem();
item2.id="002";
item2.name="天上";
this.listBox1.Items.Add(item2);
MyItem item3=new MyItem();
item3.id="003";
item3.name="地下";
this.listBox1.Items.Add(item3);
MyItem item4=new MyItem();
item4.id="004";
item4.name="地上";
this.listBox1.Items.Add(item4);
}
------------------------------------------------------
private void button1_Click(object sender, System.EventArgs e)
{
MyItem tmp =(MyItem)this.listBox1.Items[this.listBox1.SelectedIndex];
MessageBox.Show(tmp.id);
}
经过测试,果然如此,哈哈
=========================
感想
=============
从listbox这样的小地方可以看出
.net的类库设计的确很优雅
很能体现思想
比如这个列表框的元素,这个元素不是一个string,
因为设计者料到 , 用户拿列表框不是仅仅作为string来用, 所以他把item抽象成object
但是还要正常显示元素的文本,
所以他在显示文本的时候就调用object的ToString
这样
就优雅的多了
用户(程序员)可以使用任何的数据类型作为元素类型,只要此元素支持Tostring就行了
而.net的所有类型都继承自object
所以Tostring就是 Items和item的一个标准"接口"
-----------------------------------------------------------------
再看delphi的ListBox,他的items是一个stringList ,
stringList的每个元素必须首先"是"一个字符串
然后相应的字符串可以对应一个额外的Object
相比.net的设计, item不必"是"一个字符串 (它可以是任何类型)
只要这个类型能向Items提供一个ToString的接口就行了
后者的设计更符合面向对象的思想
******************************************
不重复插入
for(int i=0;i<listBox1.Items.Count;i++)
{
if(! listBox1.SelectedItems.Contains(listBox1.Items[i]))
{
MessageBox.Show(listBox1.Items[i].ToString());
}
}
那么打开msdn看看windows form上的listbox吧
经过研究猜想是这样:
ListBox.Items 的类型是ListBox.ObjectCollection类型
他的add函数参数是一个object,而不是string
那么按理说,一个元素类型是object,那么系统显示这个元素的时候自然需要ToString()
所以也许可以这样做:
在窗口内写一个小类,继承自object
包含两个string的数据成员
一个是名字,一个是id
然后重载基类object的函数Tostring()
让这个小类的tostring 函数return name;
定义好这个类以后,
当添加记录到列表框的时候,
new 一个小类的对象
把名字和id赋值到两个成员
然后listbox1.items.add(yourObj);
这样大概就行了
然后在使用的时候
obj=Listbox1.selected......
obj.id .....
代码:
-------------------------------------------------------------
///
/// 列表框元素对象
///
///
public class MyItem : object
{
public string name;
public string id;
public override string ToString()
{
// TODO: 添加 MyItem.ToString 实现
return name;
}
}
----------------------------------------------------
private void Form1_Load(object sender, System.EventArgs e)
{
MyItem item1=new MyItem();
item1.id="001";
item1.name="天下";
this.listBox1.Items.Add(item1);
MyItem item2=new MyItem();
item2.id="002";
item2.name="天上";
this.listBox1.Items.Add(item2);
MyItem item3=new MyItem();
item3.id="003";
item3.name="地下";
this.listBox1.Items.Add(item3);
MyItem item4=new MyItem();
item4.id="004";
item4.name="地上";
this.listBox1.Items.Add(item4);
}
------------------------------------------------------
private void button1_Click(object sender, System.EventArgs e)
{
MyItem tmp =(MyItem)this.listBox1.Items[this.listBox1.SelectedIndex];
MessageBox.Show(tmp.id);
}
经过测试,果然如此,哈哈
=========================
感想
=============
从listbox这样的小地方可以看出
.net的类库设计的确很优雅
很能体现思想
比如这个列表框的元素,这个元素不是一个string,
因为设计者料到 , 用户拿列表框不是仅仅作为string来用, 所以他把item抽象成object
但是还要正常显示元素的文本,
所以他在显示文本的时候就调用object的ToString
这样
就优雅的多了
用户(程序员)可以使用任何的数据类型作为元素类型,只要此元素支持Tostring就行了
而.net的所有类型都继承自object
所以Tostring就是 Items和item的一个标准"接口"
-----------------------------------------------------------------
再看delphi的ListBox,他的items是一个stringList ,
stringList的每个元素必须首先"是"一个字符串
然后相应的字符串可以对应一个额外的Object
相比.net的设计, item不必"是"一个字符串 (它可以是任何类型)
只要这个类型能向Items提供一个ToString的接口就行了
后者的设计更符合面向对象的思想
******************************************
不重复插入
for(int i=0;i<listBox1.Items.Count;i++)
{
if(! listBox1.SelectedItems.Contains(listBox1.Items[i]))
{
MessageBox.Show(listBox1.Items[i].ToString());
}
}
相关文章推荐
- 转:c# 关于LISTBOX的添加项的问题 以及不重复插入
- c# 关于LISTBOX的添加项的问题 以及不重复插入
- 关于头文件重复包含以及函数重定义问题
- 关于在c#中如何遍历listbox中选中项的问题
- 将C语言编译成DLL并用C#进行调用以及关于从C#传输中文路径到C的DLL中打开文件的问题
- 关于数组以及c#学习问题
- 关于在前台页面插入C#代码的问题,导致页面不完全显示
- 关于命令行中mysql中文乱码以及不能插入中文数据的问题
- 使用C#书写SQLite数据库增删改查语句(以及插入byte[]时遇到的问题总结)
- C#关于静态函数与普通函数之间的调用问题,以及可变参数的使用
- 关于在HTML表格中插入背景图片图片重复显示的问题
- 关于oracle重复数据合并以及.前面加0问题的解决
- 数据结构(C#)--二叉查找树的先序,中序,后序的遍历问题以及最大值,最小值,插入,删除
- 关于动态存储分配函数的调用,在已经过排序的数组中查找及删除内容的操作,余数的分析,删除字符数组中的空格,对链表的逆置,在源字符串中查找子字符串的个数,函数指针以及函数的调用,循环赋值带来的问题以及插入
- 关于头文件重复包含以及函数重定义问题
- 郁闷了半天,原来是这个问题:关于C#中关于图片保存到数据库以及将数据库中的图片显示到PictureBox。
- 关于含有单双引号字符串类型的数据插入mysql遇到的问题
- 针对牛客网刷题关于重复字符串处理的问题
- C#关于MSMQ通过HTTP远程发送专有队列消息的问题
- 关于Entity Framework更新的几种方式以及可能遇到的问题(附加类型“Model”的实体失败,因为相同类型的其他实体已具有相同的主键值)在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 时如果图形中的任何实体具有冲突键值,则可能会发生上述行为