在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);
}
它按预期工作。任何人都可以向我解释一下吗?
答案 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
循环)。