关于combobox的问题,解决不了

ildp 2008-08-22 01:16:19
我的程序中使用了三个ComboBox,cmb1显示类别,cmb2显示部门,cmb3显示用户。代码如下:

private void cmb1_SelectedIndexChanged(object sender, EventArgs e)
{
string strCmd = "Select DepartmentID,Department from Departments where category=" + cmb1.SelectedText;
BindDepartmentList(strCmd);
}

private void BindDepartmentList(string strCmd)
{
using (SqlConnection con = new SqlConnection(strServerDB))
{
SqlDataAdapter adp = new SqlDataAdapter(strCmd, con);
DataSet ds = new DataSet();
adp.Fill(ds, "Departments");

cmb2.DataSource = ds.Tables["Departments"].DefaultView;
cmb2.DisplayMember = "Department";
cmb2.ValueMember = "DepartmentID";
cmb2.SelectedIndex = -1;
}
}

private void cmb2_SelectedValueChanged(object sender, EventArgs e)
{
if (cmb2.SelectedIndex != -1)
{
int iDepartmentID = Convert.ToInt32(cmb2.SelectedValue.ToString());

......
}
}



程序运行时,只要改变了cmb1的选择,就会出错。调试了一下,发现代码执行到
cmb2.DataSource = ds.Tables["Departments"].DefaultView;
时,触发cmb2_SelectedValueChanged事件,在该事件中运行了
int iDepartmentID = Convert.ToInt32(cmb2.SelectedValue.ToString());后提示“输入字符串的格式不正确”,检查cmb2.SelectedValue.ToString()表达式的值为System.Data.DataRowView。

不知道该怎么解决?
...全文
217 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzyuanbbb 2008-11-11
  • 打赏
  • 举报
回复
我的只有一个comboBox
但是仍人出现这个问题
就是在给comboBox绑定的时候出现的这个问题
如果数据库没有数据就不会出现这个问题
ildp 2008-08-25
  • 打赏
  • 举报
回复
找到原因了,把cmb3.Items.Clear(); 改成cmb3.DataSource = null;
hiddkiller 2008-08-23
  • 打赏
  • 举报
回复
SelectionChangeCommitted

只有在界面上操作才会触发,用代码改变选择是不会触发的
hiddkiller 2008-08-23
  • 打赏
  • 举报
回复
不用
SelectedValueChanged 事件

用SelectionChangeCommitted 事件
ildp 2008-08-23
  • 打赏
  • 举报
回复
急...
ildp 2008-08-23
  • 打赏
  • 举报
回复
我在cmb1_SelectedIndexChanged中加了一行代码cmb3.Items.Clear();
private void cmb1_SelectedIndexChanged(object sender, EventArgs e)
{
cmb3.Items.Clear();
string strCmd = "Select DepartmentID,Department from Departments where category=" + cmb1.SelectedText;
BindDepartmentList(strCmd);
}

现在程序运行时,只要选择了cmb2中的部门后,再改变cmb1的选择,程序就会没有响应;而如果不选择cmb2中的部门,也就是cmb3中没有值时,改变cmb1的选择没有问题。
调试时,代码运行到cmb3.Items.Clear();后,连调试器都没响应了,这是怎么回事?
ildp 2008-08-23
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 hiddkiller 的回复:]
SelectionChangeCommitted

只有在界面上操作才会触发,用代码改变选择是不会触发的
[/Quote]

楼上正解!
ildp 2008-08-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dixiashidixiashi 的回复:]
你点击cmb1 的时候 是对cmb2的数据源进行绑定的,即就改变了cmb2的SelectIndex,所以cmb2的数据源重新绑定时肯定会执行触发SelectedValueChanged事件,3 楼的方法 理论上可行 lz好好测测
[/Quote]

3楼的方法试了,可是代码执行到cmb2.DataSource = ds.Tables["Departments"].DefaultView时,还是会触发cmb2_SelectedValueChanged事件

按照5楼和6楼的方法改了一下,代码如下:

private void BindDepartmentList(string strCmd)
{
using (SqlConnection con = new SqlConnection(strServerDB))
{
SqlDataAdapter adp = new SqlDataAdapter(strCmd, con);
DataSet ds = new DataSet();
adp.Fill(ds, "Departments");

cmb2.DisplayMember = "Department";
cmb2.ValueMember = "DepartmentID";
cmb2.DataSource = ds.Tables["Departments"].DefaultView;
cmb2.SelectedIndex = -1;
}
}

private void cmb2_SelectedValueChanged(object sender, EventArgs e)
{
if (cmb2.SelectedIndex != -1)
{
System.Data.DataRowView dr = (System.Data.DataRowView)cmb2.SelectedItem;
int iDepartmentID = Convert.ToInt32(dr.Row.ItemArray[0].ToString());
string strCmd = "Select UserID,UserName from Users where DepartmentID =" + iDepartmentID;
BindUserList(strCmd);
}
}

private void BindUserList(string strCmd)
{
using (SqlConnection con = new SqlConnection(strServerDB))
{
SqlDataAdapter adp = new SqlDataAdapter(strCmd, con);
DataSet ds = new DataSet();
adp.Fill(ds, "Users");

cmb3.DisplayMember = "UserName";
cmb3.ValueMember = "UserID";
cmb3.DataSource = ds.Tables["Users"].DefaultView;
cmb3.SelectedIndex = -1;

}
}

现在不会出错了,但仍存在下列问题:
1、调试时发现,运行到cmb2.ValueMember = "DepartmentID"; 时也会触发cmb2_SelectedValueChanged,此时cmb2.SelectedIndex=-1。
此时还没有开始绑定数据源,为什么会触发cmb2_SelectedValueChanged呢?
2、由于运行到cmb2.DataSource = ds.Tables["Departments"].DefaultView;时触发cmb2_SelectedValueChanged,此时cmb2.SelectedIndex=0,所以程序运行时,选择了cmb1中的值后,cmb2和cmb3都被填充了数据,也就是说,还没有选择cmb2的值,cmb3就根据cmb2的第一个部门填充了该部门的所有用户。
3、SelectedValue这一属性到底应该怎么用呢?
wanghui0380 2008-08-22
  • 打赏
  • 举报
回复
另外cmb2.SelectedIndex=-1;应该提前,否则他会触发事件
wanghui0380 2008-08-22
  • 打赏
  • 举报
回复
6楼应该是对的,selectedValue是先找ValueMember定义的值,如果没有valueMember他会找对象ToString()的值,DataRowView没有重载ToString方法,所以默认调用object的类名。
地下室 2008-08-22
  • 打赏
  • 举报
回复
你点击cmb1 的时候 是对cmb2的数据源进行绑定的,即就改变了cmb2的SelectIndex,所以cmb2的数据源重新绑定时肯定会执行触发SelectedValueChanged事件,3 楼的方法 理论上可行 lz好好测测
ildp 2008-08-22
  • 打赏
  • 举报
回复
楼上的这些方法全试过了都不行,现在问题的关键是在绑定cmb2的数据源时触发了cmb2_SelectedValueChanged事件,而这时cmb2只填充了第一行数据。
不应该这样啊,我又没有选择cmb2中的值,怎么会触发SelectedValueChanged呢?(我用的是VS2005)
jimh 2008-08-22
  • 打赏
  • 举报
回复
private void BindDepartmentList(string strCmd)
{
using (SqlConnection con = new SqlConnection(strServerDB))
{
SqlDataAdapter adp = new SqlDataAdapter(strCmd, con);
DataSet ds = new DataSet();
adp.Fill(ds, "Departments");

//cmb2.DataSource = ds.Tables["Departments"].DefaultView; //这里顺序要换换
cmb2.DisplayMember = "Department";
cmb2.ValueMember = "DepartmentID";
cmb2.DataSource = ds.Tables["Departments"].DefaultView; //先设定Member,再绑定应该就没问题了
cmb2.SelectedIndex = -1;
}
}
atlasroben 2008-08-22
  • 打赏
  • 举报
回复
楼主你取值方式错误了用下面的方法
System.Data.DataRowView dr = (System.Data.DataRowView)this.comboBox1.SelectedItem;
this.button2.Text = dr.Row.ItemArray[0].ToString();
0是text 1是value 这样才能准确的取到你的绑定值
BillMhw 2008-08-22
  • 打赏
  • 举报
回复
cmb2的value所设置的字段不正确吧,combox有TEXT和VALUE的设置,估计你的VALUE所设置的字段的类型或值存在问题
lsj_zrp 2008-08-22
  • 打赏
  • 举报
回复
private void BindDepartmentList(string strCmd)
{
using (SqlConnection con = new SqlConnection(strServerDB))
{
SqlDataAdapter adp = new SqlDataAdapter(strCmd, con);
DataSet ds = new DataSet();
adp.Fill(ds, "Departments");

this.cmb2.SelectedIndexChanged -= this.cmb2_SelectedValueChanged;
cmb2.DataSource = ds.Tables["Departments"].DefaultView;
cmb2.DisplayMember = "Department";
cmb2.ValueMember = "DepartmentID";
cmb2.SelectedIndex = -1;
this.cmb2.SelectedIndexChanged += this.cmb2_SelectedValueChanged;
}
}
LQknife 2008-08-22
  • 打赏
  • 举报
回复
既然知道是System.Data.DataRowView这个了就直接把cmb2.SelectedValue.转化成System.Data.DataRowView然后在取其中的值
zlb789 2008-08-22
  • 打赏
  • 举报
回复
没遇到过这样的问题
绑定的时候 怎么会触发那个事件呢
关注/

110,499

社区成员

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

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

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