如何删除 C# WFA 中动态添加的标签?
How to remove dynamically added label in C# WFA?
我在尝试从控件中删除标签时遇到问题。
我在 tabcontrol 中有 6 个标签页,它们应该具有相同的输出。
我使用了一个复选框来添加元素,效果很好。
每当我尝试从控件中删除标签时,标签仍然可见。
我不确定我是否错误地引用了标签,或者是否有其他方法可以做到这一点。
还尝试使用 Dispose() 但没有成功。请原谅英语不好。
private void tabpages_Feltolt()
{
int index = 0;
foreach (TabPage tab in tabControl1.Controls)
{
if (tabControl1.Controls.IndexOf(tab)!=tabControl1.Controls.IndexOf(tabPage_Meret))
{
CheckBox checkBox_sikmaras = new CheckBox()
{
Parent = this,
Location = new Point(10, 10),
AutoSize = true,
Tag=index,
};
Label label_checkbox_sikmaras = new Label()
{
Parent = this,
Location = new Point(25, 10),
AutoSize = true,
Text = "Síkmarás",
};
checkBox_sikmaras.CheckedChanged += CheckBox_sikmaras_CheckedChanged;
Control[] controls = new Control[]
{
checkBox_sikmaras,
label_checkbox_sikmaras,
};
tab.Controls.AddRange(controls);
}
index++;
}
}
private void CheckBox_sikmaras_CheckedChanged(object sender, EventArgs e)
{
CheckBox sikmaras = (CheckBox)sender;
TabPage tab = tabControl1.TabPages[(int)sikmaras.Tag];
Label label_sikmaras_tabla = new Label()
{
Parent = this,
Location = new Point(10, 25),
AutoSize = true,
Text = "Síkmarás",
Name = Convert.ToString(sikmaras.Tag),
};
Control[] controls = new Control[]
{
label_sikmaras_tabla,
};
if (sikmaras.Checked)
{
tabControl1.TabPages[(int)sikmaras.Tag].Controls.AddRange(controls);
}
else
{
foreach (var control in controls)
{
if (tab.Controls.Contains(control))
{
Control controltoremove = tabControl1.TabPages[Convert.ToInt32(sikmaras.Tag)].Controls[Convert.ToString(sikmaras.Tag)];
tabControl1.TabPages[(int)sikmaras.Tag].Controls.Remove(controltoremove);
}
}
}
}
首先。
每次调用时,您都会在 CheckBox_sikmaras_CheckedChanged 中创建 Label 的新实例。这就是为什么 if (tab.Controls.Contains(control))
总是 returns 错误。尽管它们的字段相同,但标签不同。
其次。
为什么要从 TabPage 获取 controltoremove,如果您已经知道它包含来自 if (tab.Controls.Contains(control))
的内容?删除它即可。
这里是工作代码的例子。
public Form1()
{
InitializeComponent();
label_sikmaras_tabla = new Label()
{
Location = new Point(10, 25),
AutoSize = true,
Text = "Síkmarás",
//Name = Convert.ToString(sikmaras.Tag),
};
}
Label label_sikmaras_tabla;
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
CheckBox sikmaras = (CheckBox)sender;
sikmaras.Tag = 1;
TabPage tab = tabControl1.TabPages[(int)sikmaras.Tag];
Control[] controls = new Control[]
{
label_sikmaras_tabla,
};
if (sikmaras.Checked)
{
tabControl1.TabPages[(int)sikmaras.Tag].Controls.AddRange(controls);
}
else
{
foreach (var control in controls)
{
if (tab.Controls.Contains(control))
{
//Control controltoremove = tabControl1.TabPages[Convert.ToInt32(sikmaras.Tag)]
// .Controls[Convert.ToString(sikmaras.Tag)];
tabControl1.TabPages[(int)sikmaras.Tag].Controls.Remove(control);
}
}
}
}
我在尝试从控件中删除标签时遇到问题。 我在 tabcontrol 中有 6 个标签页,它们应该具有相同的输出。 我使用了一个复选框来添加元素,效果很好。 每当我尝试从控件中删除标签时,标签仍然可见。 我不确定我是否错误地引用了标签,或者是否有其他方法可以做到这一点。 还尝试使用 Dispose() 但没有成功。请原谅英语不好。
private void tabpages_Feltolt()
{
int index = 0;
foreach (TabPage tab in tabControl1.Controls)
{
if (tabControl1.Controls.IndexOf(tab)!=tabControl1.Controls.IndexOf(tabPage_Meret))
{
CheckBox checkBox_sikmaras = new CheckBox()
{
Parent = this,
Location = new Point(10, 10),
AutoSize = true,
Tag=index,
};
Label label_checkbox_sikmaras = new Label()
{
Parent = this,
Location = new Point(25, 10),
AutoSize = true,
Text = "Síkmarás",
};
checkBox_sikmaras.CheckedChanged += CheckBox_sikmaras_CheckedChanged;
Control[] controls = new Control[]
{
checkBox_sikmaras,
label_checkbox_sikmaras,
};
tab.Controls.AddRange(controls);
}
index++;
}
}
private void CheckBox_sikmaras_CheckedChanged(object sender, EventArgs e)
{
CheckBox sikmaras = (CheckBox)sender;
TabPage tab = tabControl1.TabPages[(int)sikmaras.Tag];
Label label_sikmaras_tabla = new Label()
{
Parent = this,
Location = new Point(10, 25),
AutoSize = true,
Text = "Síkmarás",
Name = Convert.ToString(sikmaras.Tag),
};
Control[] controls = new Control[]
{
label_sikmaras_tabla,
};
if (sikmaras.Checked)
{
tabControl1.TabPages[(int)sikmaras.Tag].Controls.AddRange(controls);
}
else
{
foreach (var control in controls)
{
if (tab.Controls.Contains(control))
{
Control controltoremove = tabControl1.TabPages[Convert.ToInt32(sikmaras.Tag)].Controls[Convert.ToString(sikmaras.Tag)];
tabControl1.TabPages[(int)sikmaras.Tag].Controls.Remove(controltoremove);
}
}
}
}
首先。
每次调用时,您都会在 CheckBox_sikmaras_CheckedChanged 中创建 Label 的新实例。这就是为什么 if (tab.Controls.Contains(control))
总是 returns 错误。尽管它们的字段相同,但标签不同。
其次。
为什么要从 TabPage 获取 controltoremove,如果您已经知道它包含来自 if (tab.Controls.Contains(control))
的内容?删除它即可。
这里是工作代码的例子。
public Form1()
{
InitializeComponent();
label_sikmaras_tabla = new Label()
{
Location = new Point(10, 25),
AutoSize = true,
Text = "Síkmarás",
//Name = Convert.ToString(sikmaras.Tag),
};
}
Label label_sikmaras_tabla;
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
CheckBox sikmaras = (CheckBox)sender;
sikmaras.Tag = 1;
TabPage tab = tabControl1.TabPages[(int)sikmaras.Tag];
Control[] controls = new Control[]
{
label_sikmaras_tabla,
};
if (sikmaras.Checked)
{
tabControl1.TabPages[(int)sikmaras.Tag].Controls.AddRange(controls);
}
else
{
foreach (var control in controls)
{
if (tab.Controls.Contains(control))
{
//Control controltoremove = tabControl1.TabPages[Convert.ToInt32(sikmaras.Tag)]
// .Controls[Convert.ToString(sikmaras.Tag)];
tabControl1.TabPages[(int)sikmaras.Tag].Controls.Remove(control);
}
}
}
}