【问题标题】:windows forms listbox add item while it is not createdWindows 窗体列表框在未创建时添加项目
【发布时间】:2019-12-14 14:08:04
【问题描述】:

我想知道它是如何工作的!!!

public Form1()
{
    InitializeComponent();
    listBox1.Items.Add(listBox1.Created.ToString());
}

它打印false为什么???这个控件是什么时候创建的?我以为InitializeComponent() 创建控件。但它喜欢我没有完全创建控件!以及如何在未创建项目时添加项目???

P.S:我问这个问题是因为我喜欢在构造函数中使用listBox1.Invoke 来打印一些日志。我使用invoke,因为我的程序使用多个线程。但请关注我的问题,而不是我为什么需要它。谢谢!

【问题讨论】:

  • 覆盖表单的OnCreateControl() 方法,而不是使用它的构造函数。

标签: c# windows winforms


【解决方案1】:

因为在 ``()is objectlistBox1` 期间仅构造,分配在堆上并定义。 你基本上可以看到这个

InitializeComponent();          
listBox1.Items.Add(listBox1 is object); //Returns true

但是整个表单是在Form 构造函数之后呈现的。 您可以通过不在构造函数中编写代码来避免这个问题(因为基本上它应该构造对象,而不是做其他事情)。 代替构造函数,将代码编写为对 Load 事件的反应,如下所示:

        public Form1()
        {
            InitializeComponent();
            listBox1.Items.Add(listBox1.Created.ToString());
            this.Load += Form1_Load;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            listBox1.Items.Add(listBox1.Created.ToString());
        }

Load 事件在构造之后被调用(而方法Application.Run(new Form1()); si 被调用)并且你可以保证一切都被创建了。

未创建时如何添加项目? 基本上是因为将项目添加到列表框是分开的,以便添加到集合并呈现它。

此代码添加所有项目,然后调用渲染

            for (int i = 0; i < 10; i++)
            {
                listBox1.Items.Add(i.ToString());
                Thread.Sleep(200);
            }

所以你可以添加一个项目,因为内存存在并且渲染没有被调用。 在创建可视化 listbox1 后,会使用项目呈现。

在调用过程中抛出异常的原因基本上是列表框构造未完成。我认为这只是一种安全预防措施。

【讨论】:

  • 感谢您的回答。我已经知道我可以使用 form_load 事件。但这个问题的重点是我如何将项目添加到未创建的控件但它接受并显示它!虽然我不能使用调用来做到这一点!很复杂!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-06
  • 1970-01-01
  • 2020-07-14
相关资源
最近更新 更多