【发布时间】:2013-08-20 19:50:47
【问题描述】:
考虑以下代码。这是我在我创建的用户控件中实现的流程的简化。
//MyUserControl Constructor
public MyUserControl(field, value)
{
InitializeComponents();
string cType = resolveControlType(field);
switch (cType)
{
...
case "ComboBox": AddComboBox(field, value);
...
}
}
AddComboBox(string fieldID, object value)
{
ComboBox cbo = new ComboBox();
cbo.DisplayMember = "DisplayMember";
cbo.ValueMember = "ValueMember";
//We set the DataSource to a DataTable
cbo.DataSource = DBCaller.GetListAsDataTable(fieldID);
this.Controls.Add(cbo);
cbo.SelectedValue = value; //<-- Weird stuff happening here?!
// If you don't break here, it
// doesn't look like the correct
// record is selected.
// However, add a breakpoint,
// scroll through cbo's properties
// and this assignment will work
// properly when you continue?!
}
我的问题是,当我将值分配给控件时,ComboBox 中的文本会显示我的 DataSource 表中的第一项。
但是,如果我在 cbo.SelectedValue = value; 行上放置一个断点,并使用 Intellisense 滚动浏览与我的 ComboBox 关联的属性,则会在 ComboBox 上进行初始化,从而解决此问题。一旦我继续运行代码,我的表单就会加载 ComboBox 上显示的正确值。
发生了什么,我该如何解决?
【问题讨论】:
-
当您完成调试并且您的应用程序完全运行时,选择的值仍然正确吗?
-
@YairNevet。正确的。如果我在分配行中断,在分配发生之前,并使用智能感知滚动浏览
cbo的属性,一切正常。但是,如果我不调试,我的 Combo 会在我的 DataTable 中显示第一条记录的文本。我假设该值是正确的,但是控件上显示的文本不正确。然而,这种假设只是推测性的,并未得到证实。 -
代码没有显示,但你是在添加
SelectedIndexChanged事件吗? -
@YuriyGalanter:是的。实际上,SelectedIndexChanged 事件是一个 lambda 语句,就在分配 DataSource 之后。仅供参考,在活动声明中,我从不取消活动。我只是检查是否选择了第一行,因此我可以提示用户输入新的记录输入屏幕——不过,这在初始化时不会发生。
-
@RLH 你能发布事件处理程序的代码吗?另外(作为测试)您可以在分配
SelectedValue后附加处理程序