ComboBox.SelectedValue 在表单的构造函数中为空
ComboBox.SelectedValue is null in the Form's constructor
我生成了一个非常简单的代码片段:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
dt = new DataTable();
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Title", typeof(string));
dt.Rows.Add(1, "One");
dt.Rows.Add(2, "Two");
cmb = new ComboBox();
cmb.DropDownStyle = ComboBoxStyle.DropDownList;
cmb.DisplayMember = "Title";
cmb.ValueMember = "ID";
cmb.DataSource = dt;
this.Controls.Add(cmb);
cmb.SelectedValue = 2;
}
}
当我设置值cmb.SelectedValue
时,SelectedValue
是null
。
我知道如果我将此代码移至 Form1_Load
处理程序,它将按预期工作,但我需要在 Form 的构造函数中使用它。
请试试这个:
.
.
.
this.Controls.Add(cmb);
cmb.VisibleChanged += VisibleChangedHandler;
void VisibleChangedHandler(object sender, EventArgs e)
{
cmb.SelectedValue = 2;
cmb.VisibleChanged -= VisibleChangedHandler;
}
.NET Framework 不允许您为 ComboBox 控件设置 SelectedIndex
或 SelectedValue
,直到该控件可见为止。因此,如果您必须在 Form 构造函数中执行此操作,则需要推迟 "Selected" 赋值,直到 cmb 控件变得可见为止。为此,通过连接处理程序来挂接其 VisibleChanged 事件。在这里,我添加了一个 VisibleChangedHandler 作为本地函数(您可以通过将其移出 Load 方法使其成为常规方法,但将其保留在本地是有意义的,因为您将只使用它一次)。添加处理程序——然后在执行后删除处理程序。
您可以在窗体的构造函数中调用 CreateControl() 来强制创建控件的句柄。
Forces the creation of the visible control, including the creation of
the handle and any visible child controls.
同样的效果读Handle属性:
The value of the Handle property is a Windows HWND
. If the handle has
not yet been created, referencing this property will force the handle
to be created.
SelectValue
属性 将在这一点之后具有价值。
public Form1()
{
InitializeComponent();
// [...]
this.Controls.Add(cmb);
cmb.CreateControl();
cmb.SelectedValue = 2;
}
我生成了一个非常简单的代码片段:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
dt = new DataTable();
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Title", typeof(string));
dt.Rows.Add(1, "One");
dt.Rows.Add(2, "Two");
cmb = new ComboBox();
cmb.DropDownStyle = ComboBoxStyle.DropDownList;
cmb.DisplayMember = "Title";
cmb.ValueMember = "ID";
cmb.DataSource = dt;
this.Controls.Add(cmb);
cmb.SelectedValue = 2;
}
}
当我设置值cmb.SelectedValue
时,SelectedValue
是null
。
我知道如果我将此代码移至 Form1_Load
处理程序,它将按预期工作,但我需要在 Form 的构造函数中使用它。
请试试这个:
.
.
.
this.Controls.Add(cmb);
cmb.VisibleChanged += VisibleChangedHandler;
void VisibleChangedHandler(object sender, EventArgs e)
{
cmb.SelectedValue = 2;
cmb.VisibleChanged -= VisibleChangedHandler;
}
.NET Framework 不允许您为 ComboBox 控件设置 SelectedIndex
或 SelectedValue
,直到该控件可见为止。因此,如果您必须在 Form 构造函数中执行此操作,则需要推迟 "Selected" 赋值,直到 cmb 控件变得可见为止。为此,通过连接处理程序来挂接其 VisibleChanged 事件。在这里,我添加了一个 VisibleChangedHandler 作为本地函数(您可以通过将其移出 Load 方法使其成为常规方法,但将其保留在本地是有意义的,因为您将只使用它一次)。添加处理程序——然后在执行后删除处理程序。
您可以在窗体的构造函数中调用 CreateControl() 来强制创建控件的句柄。
Forces the creation of the visible control, including the creation of the handle and any visible child controls.
同样的效果读Handle属性:
The value of the Handle property is a Windows
HWND
. If the handle has not yet been created, referencing this property will force the handle to be created.
SelectValue
属性 将在这一点之后具有价值。
public Form1()
{
InitializeComponent();
// [...]
this.Controls.Add(cmb);
cmb.CreateControl();
cmb.SelectedValue = 2;
}