sha*_*han 19 c# panel dynamic-controls winforms
我在Windows窗体的面板上动态生成控件,我还生成了一个用于删除控件的按钮,所有控件都在行中.
int c = 0;
private void button1_Click(object sender, EventArgs e)
{
int v;
v = c++;
panel1.VerticalScroll.Value = VerticalScroll.Minimum;
ComboBox combo = new ComboBox();
combo.Name = "combobox" + v ;
combo.Location = new Point(30, 5 + (30 * v));
ComboBox combo2 = new ComboBox();
combo2.Name = "combobox2" + v ;
combo2.Location = new Point(170, 5 + (30 * v));
TextBox txt = new TextBox();
txt.Name = "txtbx" + v;
txt.Location = new Point(300, 5 + (30 * v));
TextBox txt2 = new TextBox();
txt2.Name = "txtbx2" + v;
txt2.Location = new Point(450, 5 + (30 * v));
TextBox txt3 = new TextBox();
txt3.Name = "txtbx3" + v;
txt3.Location = new Point(600, 5 + (30 * v));
Button btn = new Button();
btn.Name = "btn" + v;
btn.Text = "Remove";
btn.Location = new Point(750, 5 + (30 * v));
panel1.Controls.Add(combo);
panel1.Controls.Add(btn);
panel1.Controls.Add(txt);
panel1.Controls.Add(combo2);
panel1.Controls.Add(txt2);
panel1.Controls.Add(txt3);
btn.Click += new EventHandler(btn_Click);
combo.Tag = btn;
combo2.Tag = combo;
btn.Tag = combo2;
}
private void btn_Click(object sender, EventArgs e)
{
ComboBox cb3 = btnh.Tag as ComboBox;
ComboBox cb4 = cb3.Tag as ComboBox;
panel1.Controls.Remove(cb3);
panel1.Controls.Remove(cb4);
panel1.Controls.Remove(btnh);
}
Run Code Online (Sandbox Code Playgroud)
现在,如何在单击该行中的按钮时从行中删除所有控件?
naw*_*fal 34
您仍然没有说明要删除哪个控件,要删除哪种控件或者如何识别它们.
您可以循环访问控件以删除特定控件.
如果你有Linq,它很容易:
private void btn_Click(object sender, EventArgs e)
{
panel1.Controls.Clear(); //to remove all controls
//to remove all comboboxes
foreach (Control item in panel1.Controls.OfType<ComboBox>())
{
panel1.Controls.Remove(item);
}
//to remove control by Name
foreach (Control item in panel1.Controls.OfType<Control>())
{
if (item.Name == "bloodyControl")
panel1.Controls.Remove(item);
}
//to remove just one control, no Linq
foreach (Control item in panel1.Controls)
{
if (item.Name == "bloodyControl")
{
panel1.Controls.Remove(item);
break; //important step
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
由于您已经标记了控件,因此很容易做到这一点.您只需从标签中检索控件即可.但你需要适当标记:
改为:
private void button1_Click(object sender, EventArgs e)
{
int v;
v = c++;
panel1.VerticalScroll.Value = VerticalScroll.Minimum;
Button btn = new Button();
btn.Name = "btn" + v;
btn.Text = "Remove";
btn.Location = new Point(750, 5 + (30 * v));
btn.Click += new EventHandler(btn_Click);
ComboBox combo = new ComboBox();
combo.Name = "combobox" + v ;
combo.Location = new Point(30, 5 + (30 * v));
combo.Tag = btn;
ComboBox combo2 = new ComboBox();
combo2.Name = "combobox2" + v ;
combo2.Location = new Point(170, 5 + (30 * v));
combo2.Tag = btn;
TextBox txt = new TextBox();
txt.Name = "txtbx" + v;
txt.Location = new Point(300, 5 + (30 * v));
txt.Tag = btn;
TextBox txt2 = new TextBox();
txt2.Name = "txtbx2" + v;
txt2.Location = new Point(450, 5 + (30 * v));
txt2.Tag = btn;
TextBox txt3 = new TextBox();
txt3.Name = "txtbx3" + v;
txt3.Location = new Point(600, 5 + (30 * v));
txt3.Tag = btn;
panel1.Controls.Add(combo);
panel1.Controls.Add(btn);
panel1.Controls.Add(txt);
panel1.Controls.Add(combo2);
panel1.Controls.Add(txt2);
panel1.Controls.Add(txt3);
}
private void btn_Click(object sender, EventArgs e)
{
//to remove control by Name
foreach (Control item in panel1.Controls.OfType<Control>())
{
if (item.Tag == sender || item == sender)
panel1.Controls.Remove(item);
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,您使用按钮标记控件,因此在按钮单击时,您可以删除所有控件,其标签是您从sender参数中获得的单击按钮.但这种方法的缺点是你必须枚举面板的所有控件都不是很好.
编辑:当我开始学习时,下面的代码是针对OP现在不使用的表格布局面板.但无论如何,桌面布局更适合这项工作.
我建议你这样做:
private void button1_Click(object sender, EventArgs e)
{
int v;
v = c++;
panel1.VerticalScroll.Value = VerticalScroll.Minimum;
Button btn = new Button();
btn.Name = "btn" + v;
btn.Text = "Remove";
btn.Location = new Point(750, 5 + (30 * v));
btn.Click += new EventHandler(btn_Click);
btn.Tag = v;
ComboBox combo = new ComboBox();
combo.Name = "combobox" + v ;
combo.Location = new Point(30, 5 + (30 * v));
combo.Tag = v;
ComboBox combo2 = new ComboBox();
combo2.Name = "combobox2" + v ;
combo2.Location = new Point(170, 5 + (30 * v));
combo2.Tag = v;
TextBox txt = new TextBox();
txt.Name = "txtbx" + v;
txt.Location = new Point(300, 5 + (30 * v));
txt.Tag = v;
TextBox txt2 = new TextBox();
txt2.Name = "txtbx2" + v;
txt2.Location = new Point(450, 5 + (30 * v));
txt2.Tag = v;
TextBox txt3 = new TextBox();
txt3.Name = "txtbx3" + v;
txt3.Location = new Point(600, 5 + (30 * v));
txt3.Tag = v;
panel1.Controls.Add(combo);
panel1.Controls.Add(btn);
panel1.Controls.Add(txt);
panel1.Controls.Add(combo2);
panel1.Controls.Add(txt2);
panel1.Controls.Add(txt3);
}
private void btn_Click(object sender, EventArgs e)
{
int toBeDeletedRow = (int)((Control)sender).Tag;
for (int row = panel1.RowCount - 1; row >= 0; row--)
{
if (row == toBeDeletedRow)
{
panel1.RowStyles.RemoveAt(row);
panel1.RowCount--;
return;
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您有一个 Panel o 其他容器,其中包含更多用于删除所有或多个组件的组件,您可以通过这种方式进行。
在第一步中,您加载数组或列表中的组件。
List<PersonalUserControl> lst = new List<PersonalUserControl>();
foreach (Object obj in this.PanelImplementationTeam.Controls)
{
//DO NOT REMOVE COMPONENT IN THIS LOOP BECAUSE
//YOU DECREASE THE .Controls ARRAY AND YOU WILL HAVE AN ERROR
if (obj is PersonalUserControl)
{
lst.Add((PersonalUserControl)obj);
}
}
foreach(PersonalUserControl uc in lst)
{
uc.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
74013 次 |
| 最近记录: |