在用户控件中填充 ComboBox

Posted

技术标签:

【中文标题】在用户控件中填充 ComboBox【英文标题】:Populating ComboBox in User Control 【发布时间】:2021-08-27 16:12:10 【问题描述】:

我试图了解表单中用户控件的生命周期。以下是一个测试项目,但是,UserControl1(通过设计器添加)正在显示,但 ComboBox1 中没有填充数据。 UserControl2 不显示(在 Form1 OnLoad 事件中添加),并且 UserControl3 不通过 Button 事件显示。任何帮助将不胜感激。

Form1 的代码如下:

using System;
using System.Windows.Forms;

namespace ComboBoxTest

    public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent();
        

        private void Form2_Load(object sender, EventArgs e)
        
            using (UserControl1 ucCtrl = new UserControl1())
            
                groupBox2.Controls.Add(ucCtrl);
                ucCtrl.BringToFront();
            
        

        private void Button1_Click(object sender, EventArgs e)
        
            using (UserControl1 ucCtrl = new UserControl1())
            
                groupBox3.Controls.Clear();
                groupBox3.Controls.Add(ucCtrl);
                ucCtrl.BringToFront();
            
        
    

这是 UserControl1 的代码

using System;
using System.Data;
using System.Windows.Forms;

namespace ComboBoxTest

    public partial class UserControl1 : UserControl
    
        public UserControl1()
        
            InitializeComponent();
            PopulateComboBox();
        

        private void PopulateComboBox()
        
            using (DataTable dtData = new DataTable())
            
                DataColumn dtCol;
                DataRow dtRow;

                dtCol = new DataColumn
                
                    DataType = typeof(Int32),
                    ColumnName = "Index"
                ;
                dtData.Columns.Add(dtCol);

                dtCol = new DataColumn
                
                    DataType = typeof(String),
                    ColumnName = "Option"
                ;
                dtData.Columns.Add(dtCol);

                for (int xI = 0; xI < 5; xI++)
                
                    dtRow = dtData.NewRow();

                    dtRow["Index"] = xI;
                    dtRow["Option"] = "Option " + Convert.ToString(xI);
                    dtData.Rows.InsertAt(dtRow, xI);
                
                comboBox1.DataSource = dtData;
                comboBox1.DisplayMember = "Option";
                comboBox1.ValueMember = "Index";
                comboBox1.SelectedIndex = 0;
            
        
    

【问题讨论】:

UserControl 的目的通常是封装一些控件的功能并将其“隐藏”起来。因此,该公司通常不会直接参与其中。理想情况下,您会“告诉”用户控件执行 GetReady 之类的操作,然后它会为您处理所有组件 删除 using 语句...控件在加载和点击事件中得到释放。 另一方面,PopulateComboBox 例程也会遇到同样的问题,当using 结束时,您的dtData 将被丢弃。跨度> 天啊,我的问题只是“使用”语句,现在一切正常。非常感谢扎格勒。如何标记正确答案? 【参考方案1】:

UserControl1(通过设计器添加)正在显示,但 ComboBox1 中没有填充数据。 UserControl2 不显示(在 Form1 OnLoad 事件中添加),并且 UserControl3 不通过 Button 事件显示

根本问题是因为您已将构造包装在 using 语句中。例如:

 using (UserControl1 ucCtrl = new UserControl1())
 
    groupBox2.Controls.Add(ucCtrl);
    ucCtrl.BringToFront();
 

要解决您的问题,只需删除 using 语句,因为当它到达 using 的末尾时,用户控件已被丢弃。

例如上述(using 已删除):

 UserControl1 ucCtrl = new UserControl1();
 groupBox2.Controls.Add(ucCtrl);
 ucCtrl.BringToFront();

【讨论】:

非常感谢 Zaggler,我在想 Form 或 UserControl 生命周期。现在一切都很好。 ???

以上是关于在用户控件中填充 ComboBox的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的 WPF 用户控件的依赖属性更新我的视图模型?

WPF ComboBox 绑定到不显示所选项目文本的用户控件集合

在同一页面中的另一个用户控件引发的事件上填充用户控件

带查询功能的ComboBox控件

wpf 自定义控件combobox 依赖属性

WPF 控件功能重写(ComboBox回车搜索)