NullReferenceException动态创建控件,对象似乎存在

时间:2016-07-20 08:35:47

标签: c# .net winforms null controls

在Win Forms中,我有三种测试方法。首先创建一个按钮,第二个用于创建带有两个选项卡的选项卡控件,第三个用于将创建的按钮移动到第一个选项卡。

private void button1_Click(object sender, EventArgs e)
    {
        Button przycisk = new Button();
        przycisk.Location = new Point(24, 250);
        przycisk.Name = "nowy";
        przycisk.Text = "utworzony";
        przycisk.Width = 131;
        przycisk.Height = 23;
        Controls.Add(przycisk);
    }

    private void button2_Click(object sender, EventArgs e)
    {
        TabControl zakladki = new TabControl();
        zakladki.Location = new Point(208, 160);
        zakladki.Name = "zakl";
        zakladki.Height = 150;
        zakladki.Width = 208;
        zakladki.TabPages.Add("zakladka1", "pierwsza");
        zakladki.TabPages.Add("zakladka2", "druga");
        Controls.Add(zakladki);
    }

    private void button3_Click(object sender, EventArgs e)
    {
        TabControl zakladki = (TabControl)Controls.Find("zakl", false).FirstOrDefault();
        int numerZakladki = 1;
        foreach (TabPage zakladka in zakladki.TabPages)
        {
            Control kt = Controls["nowy"];
            kt.Location = new Point(10, 10); // System.NullReferenceException
            zakladka.Controls.Add(kt);
            numerZakladki++;
        }
    }

我很难理解尝试更改引用按钮位置时的行为。上面的代码抛出System.NullReferenceException,但是当我做

if (kt != null)
{
    kt.Location = new Point(10, 10);
}

它按预期工作。任何人都可以向我解释一下吗?

3 个答案:

答案 0 :(得分:1)

新的TabControl包含两个选项卡。 如果将按钮移动到第一个选项卡,则主窗体上的控件为空。 没有循环的代码:

    private void button3_Click(object sender, EventArgs e)
    {
        TabControl zakladki = (TabControl)Controls.Find("zakl", false).FirstOrDefault();
        Control kt = Controls["nowy"];
        kt.Location = new Point(10, 10);
        zakladki.TabPages[0].Controls.Add(kt);
    }

答案 1 :(得分:0)

您的nowy控件已添加到根控件中(我猜是Form),但您正试图在zakl下的标签页中找到它们。您必须将控件添加到选项卡页面,或者在根控件中找到它们,就像使用zakl一样。

答案 2 :(得分:0)

你移动" nowy"从Form.Controls到第一个TabPage' s Controls集合的按钮。这将从第一个集合中删除控件,因此代码会在下一次迭代时抛出异常。 Control只能有一个Parent

分别为每个标签创建Button(而不是移动它),或仅将Button添加到第一个标签(没有foreach循环)。