现在要删除panel控件里的所有子控件,郁闷了两小时
第一:原本以为直接调用Clear方法就可以了,但实际上不行的,调试的时候,调用完Clear后,查看其子控件是显示为0,但窗体上还是保留着,还没立即释放,要等窗体关闭后,通过析构函数来释放,所以满足不了我的需求,不能立即生效。
第二:发现Clear方法不行后,然后自己写个foreach循环,结果是没有遍历完所有子控件就停止了,看了下.NET源码,原因如下:
看了下ControlCollection的MoveNext源码,果然没有检查集合的改变:
public
bool
MoveNext()
if
((
this
.current < (
this
.controls.Count -
1
)) && (
this
.current < (
this
.originalCount -
1
)))
this
.current++;
return
true
;
return
false
;
当你迭代完第二个元素后,
this
.controls.Count等于3-
2
=
1
,
this
.current=
1
,迭代就停止了。实际上集合中还有两个元素。
最后解决办法:
Queue<Control> query = new Queue<Control>();//临时存储获取到的control控件
/// <summary>
/// 递归获取panel1上的所有控件,并临时存储到一个队列中
/// </summary>
/// <param name="item"></param>
void DS(Control item)
for (int i = 0; i < item.Controls.Count;i++ )
if (item.Controls[i].HasChildren)
DS(item.Controls[i]);
query.Enqueue(item.Controls[i]);
private void button1_Click(object sender, EventArgs e)
DS(panel1);
//删除遍历到的控件
while (query.Count != 0)
query.Dequeue().Dispose();
参考:http://www.cnblogs.com/steed-zgf/archive/2012/04/03/2430819.html
今天在实现控件动态删除过程中遇到了点小Trouble,就是在删除的过程中只能删除一半,具体代码如下:
foreach (var control in from ctls in controlUtility.GetControls(panel1)
where ctls.Name.StartsWith("BtnTable")
select ctls)
panel1.Cont...
如是反了,则在打开主窗口时会提示报错,这时点集【转到代码】,将空间生成的代码删除即可。一、选中控件-F4到属性-事件-选中想要删除的事件名称,删除;此时Designer.cs中的一行声明代码会自动删除;将这个控件的所有有控件名的代码全部删除即可。二、回到后台程序,删除事件代码即可。注意:以上两步不可以反。
1.把自适应的类整体复制到你的工程命名空间里,这样做,每个窗体均可使用。
2.声明自适应类实例。
3.为窗体添加SizeChanged事件,并在其方法Form1_SizeChanged中,首次记录窗体和其控件初始位置和大小,之后调用类的自适应方法,完成自适应。
4.Panel,DataGridView等控件同样适用。
应用代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Windows.Forms;
using System.Diagnostics;
namespace DataFactory
partial class Form : System.Windows.Forms.Form
AutoSizeFormClass ASC = new AutoSizeFormClass(); //++++++++++声明自适应类实例
public Form()
InitializeComponent();
private void Form_Load(object sender, EventArgs e)
ASC.ControlInitializeSize(this); //++++++++++调用自适应类的初始化方法,记录窗体和其控件的初始位置和大小
private void Form_SizeChanged(object sender, EventArgs e)
ASC.ControlAutoSize(this); //++++++++++调用自适应类的初始化方法,完成自适应。
在WinForm里面有时候需要清空自己输入内容或是选择的选项,以便重新操作流程,那么一般你是怎么清空界面各个控件值的呢?如果窗体里面控件,尤其是TextBox控件比较多的时候,代码里面是不是要设置每个控件的Text属性值为空呢?下面我用这个例子,来探讨下清空界面控件值的小技巧。而且还能复用。不必每个窗体都做这些枯燥、无聊的工作。一般的做法是在清除控件的事件里面添加下面这样的代码:代码 ...
在项目开发时候,有时候编辑界面上有多个控件的值要清楚的时候,直接用"控件ID.Text = """的方法就很麻烦了,呵呵,以前就是这样用,真是孤陋寡闻,^.^ /// /// 清空控件,清空指定的TextBox和Lale /// private void ClearControl() { //查找Form1中所有的控件 foreach(Control
如果一个控件有父对象 当父释放时候 子也必然会释放。
动态创建1个TPanel 在TPanel上创建其他子控件后,释放时只要FreeAndNil TPanel 就会释放掉子控件,但是指针非 nil 需要注意。
点击button1之后只有两个按钮消失,再点击剩下两个才能消失。按我写的这个语句来说应该是一下子全部消失才对啊。求告诉哪出错了!十分只是初步悬赏,如果解决了了会有追加!!下面是button1点击事件的处理代码。。。private void button1_Click(object sender, EventArgs e) { foreach...
通俗的讲,Controls.Remove 和 Controls.Clear()的主要差别在于,Controls.Remove 可以实现一个一个的删除控件,而 Controls.Clear()是将所有的控件一次性强制删除。
如果使用foreach方法,借助Controls.Remove,按理说也可以做到删除全部控件,即:
foreach (Control mControl in thi