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时,SelectedValuenull

我知道如果我将此代码移至 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 控件设置 SelectedIndexSelectedValue,直到该控件可见为止。因此,如果您必须在 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;
}