private
void
ComboxBox1_SelectedIndexChanged(
object
sender, EventArgs e)
if
(flag)
{
//
Do something
}
}
另外还有一种办法,就是在绑定前,将SelectedIndexChanged的委托去掉,等绑定完成后,再添加事件委托。
void
BindComboBox()
{
//
去除委托
ComboBox1.SelectedIndexChanged
-=
new
EventHandler(ComboBox1_SelectedIndexChanged);
ComboBox1.DataSource
=
null
;
ComboBox1.ValueMember
=
"
ValueColumn
"
;
ComboBox1.DataSource
=
DataTable1;
//
添加委托
ComboBox1.SelectedIndexChanged
+=
new
EventHandler(ComboBox1_SelectedIndexChanged);
ComboBox1.DisplayMember
=
"
DisplayColumn
"
;
}
两种方法都可以,但是之间的优劣暂时没去比较。感觉好像处理一下委托会好点。因为这种办法真的减少了事件的激发次数。
不知道还有没有其他解决方案呢?
另,贴上一段完整的代码例子。这个例子是访问SqlServer数据库的AdventureWorks,通过ProductCategory和ProductSubCategory两级目录分类去查看Product表的内容。分别使用两个ComboBox和DataGridView完成数据绑定。效果就是选择之后会联动改变相关内容。
public
partial
class
frmProduct : Form
{
DataSet DS
=
new
DataSet();
String ConnectionString
=
"
integrated security=true; database=AdventureWorks;
server=localhost;
"
;
public
frmProduct()
{
InitializeComponent();
}
private
void
frmProduct_Load(
object
sender, EventArgs e)
{
SqlDataAdapter da
=
new
SqlDataAdapter(
"
select ProductCategoryID,[Name] from Production.ProductCategory
"
, ConnectionString)
;
cbbCategories.SelectedIndexChanged
-=
new
EventHandler(cbbCategories_SelectedIndexChanged);
da.Fill(DS,
"
ProductCategory
"
);
cbbCategories.DataSource
=
null
;
cbbCategories.ValueMember
=
"
ProductCategoryID
"
;
cbbCategories.DataSource
=
DS.Tables[
"
ProductCategory
"
];
cbbCategories.SelectedIndexChanged
+=
new
EventHandler(cbbCategories_SelectedIndexChanged);
cbbCategories.DisplayMember
=
"
Name
"
;
//
这句放在事件委托之后才会有联动效果,下同
}
private
void
cbbCategories_SelectedIndexChanged(
object
sender, EventArgs e)
{
SqlDataAdapter da
=
new
SqlDataAdapter(
"
select ProductSubCategoryID,[Name] from Production.ProductSubCategory where
ProductCategoryID=
"
+
cbbCategories.SelectedValue.ToString(), ConnectionString)
;
if
(DS.Tables[
"
ProductSubCategory
"
]
!=
null
)
{
DS.Tables[
"
ProductSubCategory
"
].Clear();
}
da.Fill(DS,
"
ProductSubCategory
"
);
cbbSubCategories.SelectedIndexChanged
-=
new
EventHandler(cbbSubCategories_SelectedIndexChanged);
cbbSubCategories.DataSource
=
null
;
cbbSubCategories.ValueMember
=
"
ProductSubCategoryID
"
;
cbbSubCategories.DataSource
=
DS.Tables[
"
ProductSubCategory
"
];
cbbSubCategories.SelectedIndexChanged
+=
new
EventHandler(cbbSubCategories_SelectedIndexChanged);
cbbSubCategories.DisplayMember
=
"
Name
"
;
}
private
void
cbbSubCategories_SelectedIndexChanged(
object
sender, EventArgs e)
{
if
(cbbSubCategories.SelectedIndex
==
-
1
)
return
;
SqlDataAdapter da
=
new
SqlDataAdapter(
"
select * from Production.Product where
ProductSubCategoryID=
"
+
cbbSubCategories.SelectedValue.ToString(), ConnectionString);
dgvProduct.DataSource
=
null
;
if
(DS.Tables[
"
Product
"
]
!=
null
)
DS.Tables[
"
Product
"
].Clear();
da.Fill(DS,
"
Product
"
);
dgvProduct.DataSource
=
DS.Tables[
"
Product
"
];
}
}
ComboBox最经常使用的事件就是SelectedIndexChanged。但在将ComboBox绑定到某个数据源的过程中,会触发SelectedIndexChanged事件,而这个时候用户并没有选择内容,其SelectedValue也不是对应字段的值。那么时写在SelectedIndexChanged中的处理代码就会因为SelectedValue的内容不正确引发异常。一般网上找到的方法
combo.SelectedValue就可以取得选中项的值了。
DisplayMember会显示在你的下拉框中,ValueMember的值和下拉框显示的值一一对应,并不在下拉框显示的。
所对应的值就是一条记录里面 有标识列ID(唯一) 有显示的列(如名称,可重复)...
今天偶尔复习下WinForm开发,在用到
ComboBox
下拉框的
时
候,想用
SelectedIndexChanged
事件
根据选中内容动态展示不同的
数据
,需求很简单,但是竟然出错了,后来发现其实就是
SelectedIndexChanged
事件
执行
时
间问题导致的,那如何解决呢,请看下面的分析。
一、DataBind()方法就是给下拉框
绑
定
的方法(这里为了让下拉框默认不选中,设置了SelectedIndex = -1)这个位置就是出问题的地方
//
数据
绑
定
private voi
你要明白,任何问题都不是孤立存在的,一定有人曾经遇到过,并且已经有更好的解决办法了,只是我还不知道。我不应该在黑暗中独自前行,去重新发明轮子,也许我的顿悟,只是别人的基本功!我应该要站在巨人的肩膀上,学习更成熟的经验和方法,然后再来解决这个问题
11-05
### 回答1:
Winform
ComboBox
数据
绑
定
是指将
数据
源
中的
数据
与
ComboBox
控件进行关联,使得
ComboBox
控件可以显示
数据
源
中的
数据
,并且可以根据用户的选择进行
数据
的操作。
数据
绑
定
可以通过代码实现,也可以通过可视化设计工具实现。在
数据
绑
定
过程中,需要注意
数据
源
的类型、
数据
绑
定
的方式、
数据
源
的更新等问题。同
时
,还需要考虑
数据
源
的安全性和
数据
的完整性,以保证
数据
的正确性和可靠性。
### 回答2:
WinForm
Combobox
数据
绑
定
指的是将
数据
源
和
Combobox
控件进行
绑
定
,从而实现
数据
的显示、选择和操作等功能。
数据
源
可以是
数据
库、XML、数组、集合等,
数据
绑
定
的方式也有多种,包括程序指
定
、
数据
绑
定
控件和
数据
源
控件等。
在WinForm
Combobox
数据
绑
定
中,可以通过以下方法来实现
数据
绑
定
:
1. 手动添加
数据
:通过程序代码直接添加
Combobox
的Items属性,比较适用于
数据
量较小的情况。
2. 在设计器中添加
数据
:在Visual Studio的设计器中,可以通过在
Combobox
的常规属性中设置Items属性,手动添加
数据
。
3.
数据
源
绑
定
:通过
数据
源
控件或
数据
绑
定
控件来
绑
定
Combobox
的
数据
源
,更适用于
数据
量较大或需要频繁更新的情况。比如,可以使用BindingSource控件对
数据
源
进行
绑
定
,使用BindingNavigator控件对
数据
进行操作和导航。
在使用
数据
源
绑
定
进行WinForm
Combobox
数据
绑
定
时
,需要注意以下几点:
1.
数据
源
必须是支持IList接口的对象,比如List<>、DataTable等。
2.
数据
源
和
Combobox
必须
绑
定
相同的
数据
类型,比如字符串、整数等。
3. 在
绑
定
数据
源
之前,需要创建
Combobox
的DisplayMember和ValueMember属性,分别表示显示的字段和值的字段。
4. 在
绑
定
数据
源
之后,可以使用SelectedItem或SelectedValue属性来获取用户选择的项。
总的来说,WinForm
Combobox
数据
绑
定
是一种非常实用的
数据
绑
定
方式,可以方便地实现
数据
的显示和操作,提高了WinForm应用程序的开发效率。在实际应用中,需要根据具体情况选择合适的
数据
源
和
数据
绑
定
方式,以达到更好的效果。
### 回答3:
WinForm中的
ComboBox
控件是在用户界面中广泛使用的一个控件,可以用来展示可选项列表、输入提示等。
ComboBox
的
数据
源
可以通过
数据
绑
定
来实现,这样可以方便的将
数据
源
与控件关联起来,实现
数据
的自动更新和整合。
在WinForm中,
ComboBox
的
数据
源
可以是DataSet、DataTable、List、Array等类型的
数据
,也可以是通过SQL查询获取的
数据
。实现
数据
绑
定
的方式有多种,其中常见的有DataSource、DisplayMember和ValueMember属性。
DataSource属性
DataSource属性可以用来指
定
ComboBox
的
数据
源
。将DataSource设置为一个集合、数组或者
数据
表等类型的
数据
源
之后,
ComboBox
就可以根据
数据
源
自动生成下拉列表的选项。例如,我们可以将
ComboBox
的DataSource属性指
定
为一个DataTable对象,然后通过
ComboBox
控件自动
绑
定
DataTable中的
数据
。
DisplayMember属性
DisplayMember属性用来指
定
ComboBox
数据
源
中的文本字段,用来表示下拉列表中每个选项的文本信息。例如,我们可以将DisplayMember属性指
定
为DataTable中的一列名为“Name”的字段,这样
ComboBox
就会在下拉列表中显示名称。
ValueMember属性
ValueMember属性用于指
定
ComboBox
数据
源
中的数值字段,用于表示
ComboBox
控件所选择的选项的数值信息。例如,我们可以将ValueMember属性指
定
为DataTable中的一列名为“ID”的字段,这样
ComboBox
就可以保存ID信息并将其与相应的选项进行匹配。
WinForm
ComboBox
控件的
数据
绑
定
需要通过三个属性DataSource、DisplayMember和ValueMember来实现。DataSource用于指
定
ComboBox
的
数据
源
,DisplayMember用于指
定
下拉列表的文本信息,ValueMember用于指
定
数值信息。这样就可以实现
ComboBox
的自动更新和整合。实际操作中,要根据情况选择合适的
数据
源
类型和
绑
定
方式。