comboBox添加"请选择"

I_was_a_novice 2014-12-23 01:20:26

DataSet ds = 读取数据

//第一种方法
//comboBox1.Items.Insert(0,"请选择");
//第二种方法
//comboBox1.Items.Add("请选择");

comboBox1.DataSource = ds.Tables[0];
comboBox1.DisplayMember = "name";
comboBox1.ValueMember = "id";


comboBox1.Items.Insert(0,"请选择");或comboBox1.Items.Add("请选择");放在comboBox1.DataSource = ds.Tables[0];之前没有效果,放在comboBox1.DataSource = ds.Tables[0];之后出现错误:System.ArgumentException: 设置 DataSource 属性后无法修改项集合。

...全文
618 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
I_was_a_novice 2014-12-30
  • 打赏
  • 举报
回复
感谢各位了,最后的解决方法是

DataSet ds = 读取数据
ArrayList mylist = new ArrayList();
mylist.Add(new DictionaryEntry("0", "请选择"));
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
          mylist.Add(new DictionaryEntry(ds.Tables[0].Rows[i]["id"], ds.Tables[0].Rows[i]["name"]));
}
this.comboBox1.DataSource = mylist;
this.comboBox1.DisplayMember = "Value";
this.comboBox1.ValueMember = "Key";
薛小坏 2014-12-23
  • 打赏
  • 举报
回复
推荐修改DataTable数据源(即插入一条你要的提示的数据)后再绑定
於黾 2014-12-23
  • 打赏
  • 举报
回复
我想想,好像UI会直接阻塞,不会刷新 如果放到线程里才会频闪
ajaxfeifei 2014-12-23
  • 打赏
  • 举报
回复
引用 13 楼 Z65443344 的回复:
而且这样不仅会有效率问题,关键是界面会闪烁 仅仅是假死,如果假死0.5秒,大多数用户可能不会发现 而如果是频繁的闪0.5秒,人眼是能看到的
如果是Winform那我们使用

List<object> items=new List<object>();
            comboBox1.Items.AddRange(items.ToArray());
可以吗?
ajaxfeifei 2014-12-23
  • 打赏
  • 举报
回复
引用 12 楼 Z65443344 的回复:
[quote=引用 11 楼 lc2737 的回复:] [quote=引用 4 楼 Z65443344 的回复:] 针对2: 绑定之前 DataRow dr=ds.Tables[0].NewRow(); dr[0]="请选择"; ds.Tables[0].Rows.InsertAt(0,dr);
大神,我不同意你这个做法,这样做会导致表的索引重建,当然在表数据很少的情况下,只是绑定到Commbox这个是没问题的,但是当数据很多的情况下,这个插入操作是会有效率问题的。以下是我的拙见:

            DataSet ds = 读取数据
            comboBox1.Items.Clear();
            
            comboBox1.Items.Add("请选择");
            foreach (DataRow row in ds.Tables[0].Rows)
            {
                comboBox1.Items.Add(row["id"].ToString(),row["name"].ToString());
            }
[/quote] 如果数据很多的话,你遍历表去操作Items,难道效率问题不是更大吗? 要知道,绑定控件只刷新一次,而你每插入一个Item,combobox就刷新一次,界面重绘可比索引重建要慢的多了[/quote] 这个每插入一个项就要刷新一次吗?这个是Winfrom程序?我还以为是Web程序
於黾 2014-12-23
  • 打赏
  • 举报
回复
而且这样不仅会有效率问题,关键是界面会闪烁 仅仅是假死,如果假死0.5秒,大多数用户可能不会发现 而如果是频繁的闪0.5秒,人眼是能看到的
於黾 2014-12-23
  • 打赏
  • 举报
回复
引用 11 楼 lc2737 的回复:
[quote=引用 4 楼 Z65443344 的回复:] 针对2: 绑定之前 DataRow dr=ds.Tables[0].NewRow(); dr[0]="请选择"; ds.Tables[0].Rows.InsertAt(0,dr);
大神,我不同意你这个做法,这样做会导致表的索引重建,当然在表数据很少的情况下,只是绑定到Commbox这个是没问题的,但是当数据很多的情况下,这个插入操作是会有效率问题的。以下是我的拙见:

            DataSet ds = 读取数据
            comboBox1.Items.Clear();
            
            comboBox1.Items.Add("请选择");
            foreach (DataRow row in ds.Tables[0].Rows)
            {
                comboBox1.Items.Add(row["id"].ToString(),row["name"].ToString());
            }
[/quote] 如果数据很多的话,你遍历表去操作Items,难道效率问题不是更大吗? 要知道,绑定控件只刷新一次,而你每插入一个Item,combobox就刷新一次,界面重绘可比索引重建要慢的多了
ajaxfeifei 2014-12-23
  • 打赏
  • 举报
回复
引用 4 楼 Z65443344 的回复:
针对2: 绑定之前 DataRow dr=ds.Tables[0].NewRow(); dr[0]="请选择"; ds.Tables[0].Rows.InsertAt(0,dr);
大神,我不同意你这个做法,这样做会导致表的索引重建,当然在表数据很少的情况下,只是绑定到Commbox这个是没问题的,但是当数据很多的情况下,这个插入操作是会有效率问题的。以下是我的拙见:

            DataSet ds = 读取数据
            comboBox1.Items.Clear();
            
            comboBox1.Items.Add("请选择");
            foreach (DataRow row in ds.Tables[0].Rows)
            {
                comboBox1.Items.Add(row["id"].ToString(),row["name"].ToString());
            }
ajaxfeifei 2014-12-23
  • 打赏
  • 举报
回复
这里给你个建议,不要为了方便而想一些很奇怪的办法,有时候遍历一下就行了。即使你采用了微软自身的绑定,微软也是遍历去做的啊。

            DataSet ds = 读取数据
            comboBox1.Items.Clear();
            
            comboBox1.Items.Add("请选择");
            foreach (DataRow row in ds.Tables[0].Rows)
            {
                comboBox1.Items.Add(row["id"].ToString(),row["name"].ToString());
            }
luhr 2014-12-23
  • 打赏
  • 举报
回复
引用 8 楼 Z65443344 的回复:
[quote=引用 7 楼 q3310017 的回复:]

comboBox1.Text = "请选择";
comboBox1.DataSource = ds.Tables[0];
comboBox1.DisplayMember = "name";
comboBox1.ValueMember = "id";
这样行不,反正就是给个请选择的提示嘛
如果combobox设置成dropdownlist而不是dropdown,那么你只能赋值成列表里有的项,不能随便乱赋值 而如果设置成dropdown,那么用户就有可能手动录入数据,而不从列表里选择[/quote]
引用 8 楼 Z65443344 的回复:
[quote=引用 7 楼 q3310017 的回复:]

comboBox1.Text = "请选择";
comboBox1.DataSource = ds.Tables[0];
comboBox1.DisplayMember = "name";
comboBox1.ValueMember = "id";
这样行不,反正就是给个请选择的提示嘛
如果combobox设置成dropdownlist而不是dropdown,那么你只能赋值成列表里有的项,不能随便乱赋值 而如果设置成dropdown,那么用户就有可能手动录入数据,而不从列表里选择[/quote] 原来如此
於黾 2014-12-23
  • 打赏
  • 举报
回复
引用 7 楼 q3310017 的回复:

comboBox1.Text = "请选择";
comboBox1.DataSource = ds.Tables[0];
comboBox1.DisplayMember = "name";
comboBox1.ValueMember = "id";
这样行不,反正就是给个请选择的提示嘛
如果combobox设置成dropdownlist而不是dropdown,那么你只能赋值成列表里有的项,不能随便乱赋值 而如果设置成dropdown,那么用户就有可能手动录入数据,而不从列表里选择
luhr 2014-12-23
  • 打赏
  • 举报
回复

comboBox1.Text = "请选择";
comboBox1.DataSource = ds.Tables[0];
comboBox1.DisplayMember = "name";
comboBox1.ValueMember = "id";
这样行不,反正就是给个请选择的提示嘛
wind_cloud2011 2014-12-23
  • 打赏
  • 举报
回复
不要绑定,可以读取后添加
於黾 2014-12-23
  • 打赏
  • 举报
回复
应该是 dr["name"]="请选择";
於黾 2014-12-23
  • 打赏
  • 举报
回复
针对2: 绑定之前 DataRow dr=ds.Tables[0].NewRow(); dr[0]="请选择"; ds.Tables[0].Rows.InsertAt(0,dr);
於黾 2014-12-23
  • 打赏
  • 举报
回复
有3种办法 1.直接把这个东西放数据库里,一起查出来 2.修改数据源datatable,新增一行 3.不要使用绑定,而是代码增加Item
I_was_a_novice 2014-12-23
  • 打赏
  • 举报
回复
引用 1 楼 q107770540 的回复:

DataSet ds = 读取数据
comboBox1.DataSource = null;
comboBox1.Items.Clear(); 

//第一种方法
comboBox1.Items.Insert(0,"请选择");
//第二种方法
//comboBox1.Items.Add("请选择");
 
comboBox1.DataSource = ds.Tables[0];
comboBox1.DisplayMember = "name";
comboBox1.ValueMember = "id";
没有效果
q107770540 2014-12-23
  • 打赏
  • 举报
回复

DataSet ds = 读取数据
comboBox1.DataSource = null;
comboBox1.Items.Clear(); 

//第一种方法
comboBox1.Items.Insert(0,"请选择");
//第二种方法
//comboBox1.Items.Add("请选择");
 
comboBox1.DataSource = ds.Tables[0];
comboBox1.DisplayMember = "name";
comboBox1.ValueMember = "id";

111,027

社区成员

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

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

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