导航

[转载]WinForm-控件的初始化顺序问题

Posted on 2013-05-17 11:52  杨彬Allen  阅读(2615)  评论(0)    收藏  举报

我在winform上添加了SizeChanged事件,还在窗口.Load方法中添加了初始化参数的方法,我原因为SizeChanged事件只有在手动改窗口的时候才会触发,但我错了,在一些OS下这个事件会在窗口.Load方法前就执行,一些win2003 32位机报错,另一些win2003 32位却不会;一些xp 32位机报错,另一些xp 32位却不会。

但有一点可以确认的时,SizeChanged事件默认是放在InitialComponent方法中的,而InitialComponent又在窗口.Load之前,所以……悲剧就这么发生了。

最后的解决办法是:将SizeChanged事件的定义从InitialComponent中移到窗口.Load中去。

        private void FrmGroupSel_Load(object sender, EventArgs e)
        {
            GetInitialFormSize();
            GetAllCrlLocation(this);
            GetAllCrlSize(this);
        }

 

        #region 
//Add by Alen Yang.2013.05.06 /*******************设定程序中可能要用到的用以存储初始数据的动态数组及相关私有变量******************************/ private readonly ArrayList ControlsNeedChange = new ArrayList("LvUnselected;LvSelected;BtnMvToRight;BtnMvAllToRight;BtnMvToLeft;BtnMvAllToLeft;GB1;frm".Split(';')); private ArrayList InitialCrl = new ArrayList(); //用以存储窗体中所有的控件名称 private ArrayList CrlLocationX = new ArrayList(); //用以存储窗体中所有的控件原始位置 private ArrayList CrlLocationY = new ArrayList(); //用以存储窗体中所有的控件原始位置 private ArrayList CrlSizeWidth = new ArrayList(); //用以存储窗体中所有的控件原始的水平尺寸 private ArrayList CrlSizeHeight = new ArrayList(); //用以存储窗体中所有的控件原始的垂直尺寸 private int FormSizeWidth; //用以存储窗体原始的水平尺寸 private int FormSizeHeight; //用以存储窗体原始的垂直尺寸 private double FormSizeChangedX; //用以存储相关父窗体/容器的水平变化量 private double FormSizeChangedY; //用以存储相关父窗体/容器的垂直变化量 private int Wcounter = 0; //为防止递归遍历控件时产生混乱,故专门设定一个全局计数器 /// <summary> /// 获得并存储窗体中各控件的初始位置 /// </summary> /// <param name="CrlContainer"></param> public void GetAllCrlLocation(Control CrlContainer) { foreach (Control Crl in CrlContainer.Controls) { if (ControlsNeedChange.Contains(Crl.Name)) { if (Crl.Controls.Count > 0) GetAllCrlLocation(Crl); InitialCrl.Add(Crl); CrlLocationX.Add(Crl.Location.X); CrlLocationY.Add(Crl.Location.Y); } } } /// <summary> /// 获得并存储窗体中各控件的初始尺寸 /// </summary> /// <param name="CrlContainer"></param> public void GetAllCrlSize(Control CrlContainer) { foreach (Control Crl in CrlContainer.Controls) { if (ControlsNeedChange.Contains(Crl.Name)) { if (Crl.Controls.Count > 0) GetAllCrlSize(Crl); CrlSizeWidth.Add(Crl.Width); CrlSizeHeight.Add(Crl.Height); } } } /// <summary> /// 获得并存储窗体的初始尺寸 /// </summary> public void GetInitialFormSize() { FormSizeWidth = this.Size.Width; FormSizeHeight = this.Size.Height; } /// <summary> /// 重新设定窗体中各控件的状态(在与原状态的对比中计算而来) /// </summary> /// <param name="CrlContainer"></param> public void ResetAllCrlState(Control CrlContainer) { FormSizeChangedX = (double)this.Size.Width / (double)FormSizeWidth; FormSizeChangedY = (double)this.Size.Height / (double)FormSizeHeight; foreach (Control Crl in CrlContainer.Controls) { if (ControlsNeedChange.Contains(Crl.Name)) { if (Crl.Controls.Count > 0) { ResetAllCrlState(Crl); } Point point = new Point(); point.X = (int)((int)CrlLocationX[Wcounter] * FormSizeChangedX); point.Y = (int)((int)CrlLocationY[Wcounter] * FormSizeChangedY); Crl.Width = (int)((int)CrlSizeWidth[Wcounter] * FormSizeChangedX); Crl.Height = (int)((int)CrlSizeHeight[Wcounter] * FormSizeChangedY); Crl.Bounds = new Rectangle(point, Crl.Size); Wcounter++; } } } /// <summary> /// 窗体大小改变事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FrmGroupSel_SizeChanged(object sender, EventArgs e) { Wcounter = 0; int counter = 0; //如果窗体的大小在改变过程中小于窗体尺寸的初始值,则窗体中的各个控件自动重置为初始尺寸,且窗体自动添加滚动条 if (this.Size.Width < FormSizeWidth || this.Size.Height < FormSizeHeight) { foreach (Control Crl in InitialCrl) { if (ControlsNeedChange.Contains(Crl.Name)) { Crl.Width = (int)CrlSizeWidth[counter]; Crl.Height = (int)CrlSizeHeight[counter]; Point point = new Point(); point.X = (int)CrlLocationX[counter]; point.Y = (int)CrlLocationY[counter]; Crl.Bounds = new Rectangle(point, Crl.Size); counter++; } } this.AutoScroll = true; } else //否则,重新设定窗体中所有控件的大小(窗体内所有控件的大小随窗体大小的变化而变化) { this.AutoScroll = false; ResetAllCrlState(this); } } #endregion

 

 

转载地址:http://blog.sina.com.cn/s/blog_757d2a7101015kh3.html