【问题标题】:ComboBox.SelectedValue is null in the Form's constructorComboBox.SelectedValue 在窗体的构造函数中为 null
【发布时间】:2020-06-15 04:20:30
【问题描述】:

我生成了一个非常简单的代码sn-p:

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 处理程序,它将按预期工作,但我需要在表单的构造函数中使用它。

【问题讨论】:

    标签: c# winforms combobox


    【解决方案1】:

    您可以在窗体的构造函数中调用CreateControl() 来强制创建控件的句柄。

    强制创建可见控件,包括创建 句柄和任何可见的子控件。

    读取Handle属性也可以达到同样的效果

    Handle 属性的值为 Windows HWND。如果手柄有 尚未创建,引用此属性将强制句柄 被创建。

    SelectValue 属性在此之后将具有值。

    public Form1()
    {
        InitializeComponent();
    
        // [...]
    
        this.Controls.Add(cmb);
    
        cmb.CreateControl();
        cmb.SelectedValue = 2;
    }
    

    【讨论】:

      【解决方案2】:

      请试试这个:

           .
           .
           .
      
           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 方法来使其成为常规方法,但将其保留在本地是有意义的,因为您只会使用它一次)。添加处理程序 - 然后在处理程序执行后将其删除。

      【讨论】:

      • 感谢@Jazimov,请检查您的答案。它遇到了这个错误:System.ArgumentOutOfRangeException: 'InvalidArgument=Value of '1' is not valid for 'SelectedIndex'. Parameter name: SelectedIndex'
      • 道歉:我测试然后看到了错误——请看我的修改。
      猜你喜欢
      • 1970-01-01
      • 2017-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 2018-11-04
      相关资源
      最近更新 更多