控件被添加到其他控件中时,该控件的什么事件被触发(VS2005)

yiemyn 2008-07-24 01:20:01
控件被添加到其他控件中时,该控件的什么事件被触发,
或者说,当一个控件被添加到其他控件中时(之前和之后),怎么做才能处理这个时刻点
在检查Control的事件和方法及源码后,也没找到合适的处理办法,冀求给予帮助.
分少另加
...全文
129 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yiemyn 2008-07-28
  • 打赏
  • 举报
回复
多谢h_w_king的帮助
h_w_king 2008-07-25
  • 打赏
  • 举报
回复
protected override void OnCreateControl()
{
if (this.Parent != null)
{
this.Text = Parent.Name;
}
base.OnCreateControl();
}
yiemyn 2008-07-25
  • 打赏
  • 举报
回复
@smntbk,
Controls的Add方法主要是这段代码在处理:
value.SetParentHandle(this.owner.InternalHandle);

首先是将控件添加到其父控件中,然后再调整其在父控件中的大小及位置;
如果重载(处理这个事件也是一样)OnControlAdded,就会发现Windows对这是两个先后的处理.
因为在编写一个自定义控件,这个控件只能在特定的父控件中移动及改变大小,同时改变该控件中的数据,
所以也对OnLocationChanged,OnMove方法进行重写,其实这两个事件算是一个,一先一后相邻执行.

但对我上面提到的问题,仍然没有帮助

yiemyn 2008-07-25
  • 打赏
  • 举报
回复
@h_w_king:
我的处理代码如下
protected override void OnParentChanged(EventArgs e)
{
base.OnParentChanged(e);
if (this.Parent != null)
{
this.Text = Parent.Name;
}
}
或者:
protected override void OnParentChanged(EventArgs e)
{
if (this.Parent != null)
{
this.Text = Parent.Name;
}
base.OnParentChanged(e);
}
无论是第一次从工具箱中拖动到其父控件中,还是在程序运行后调用其父控件的Controls.Add方法,在第一次添加到其父控件中时,均无法触发这段代码.

但是在由原来的父控件中,移动到其他父控件中时,却可以触发;
同时感谢你的帮忙!
h_w_king 2008-07-24
  • 打赏
  • 举报
回复
private void button1_Click(object sender, EventArgs e)
{

Button b = new Button();
b.ParentChanged +=new EventHandler(b_ParentChanged);
this.Controls.Add(b);

}
void b_ParentChanged(object sender, EventArgs e)
{
MessageBox.Show("sdfsdf");
}
yiemyn 2008-07-24
  • 打赏
  • 举报
回复
@h_w_king:
该控件第一次添加到父控件中并不会触发它的ParentChanged事件
无论是在开发环境中拖到父控件中,还是在运行后通过父控件的Controls.Add添加
journeydj 2008-07-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 h_w_king 的回复:]
void c_ControlAdded(object sender, ControlEventArgs e) //当有控件加入时.
void c_ParentChanged(object sender, EventArgs e)    //当控件加入到其它控件时.
[/Quote]
yiemyn 2008-07-24
  • 打赏
  • 举报
回复
谢谢smntbk,我再看下这个方法
原来看了一下源码,应该还是不够仔细
h_w_king 2008-07-24
  • 打赏
  • 举报
回复
void c_ControlAdded(object sender, ControlEventArgs e) //当有控件加入时.
void c_ParentChanged(object sender, EventArgs e) //当控件加入到其它控件时.
yiemyn 2008-07-24
  • 打赏
  • 举报
回复
具体的就是System.Windows.Forms.Control
添加到其他控件中,确切点来说,添加到Panel中
谢谢楼上那位atasroben进来发言
smntbk 2008-07-24
  • 打赏
  • 举报
回复
参考控件的Add方法源代码
public virtual void Add(Control value)
{
if (value != null)
{
if (value.GetTopLevel())
{
throw new ArgumentException(SR.GetString("TopLevelControlAdd"));
}
if (this.owner.CreateThreadId != value.CreateThreadId)
{
throw new ArgumentException(SR.GetString("AddDifferentThreads"));
}
Control.CheckParentingCycle(this.owner, value);
if (value.parent == this.owner)
{
value.SendToBack();
}
else
{
if (value.parent != null)
{
value.parent.Controls.Remove(value);
}
base.InnerList.Add(value);
if (value.tabIndex == -1)
{
int num = 0;
for (int i = 0; i < (this.Count - 1); i++)
{
int tabIndex = this[i].TabIndex;
if (num <= tabIndex)
{
num = tabIndex + 1;
}
}
value.tabIndex = num;
}
this.owner.SuspendLayout();
try
{
Control parent = value.parent;
try
{
value.AssignParent(this.owner);
}
finally
{
if ((parent != value.parent) && ((this.owner.state & 1) != 0))
{
value.SetParentHandle(this.owner.InternalHandle);
if (value.Visible)
{
value.CreateControl();
}
}
}
value.InitLayout();
}
finally
{
this.owner.ResumeLayout(false);
}
LayoutTransaction.DoLayout(this.owner, value, PropertyNames.Parent);
this.owner.OnControlAdded(new ControlEventArgs(value));
}
}
}
yiemyn 2008-07-24
  • 打赏
  • 举报
回复
有人进来看么
atlasroben 2008-07-24
  • 打赏
  • 举报
回复
希望你能说明具体的控件是什么
比如datagridview就有在控件被添加后触发的事件dataGridView1_ControlAdded
项目名称:[精仿]360安全卫士-10.30更新(CSkin Demo) 界面库版本号:10.30 最新版本 下载内容: 精仿360安全卫士源码一份, 可引用至工具箱最新版CSkin.dll一份 实现功能: 1.发光标题。 2.直角边框和阴影。 3.360安全卫士主界面模仿。 4.多系统支持,不需要win8系统,即可实现win8风格的360。 5.自定义控件的美化使用。 界面库更新文档: CC2013-10.30 1.由于SkinForm名字太多人使用,界面库命名正式改为CSkin.dll,官网www.cskin.net。 2.SkinTabControl标签中添加菜单箭头,可点击展开菜单。 3.SkinTabControl添加标签关闭按钮。 4.修复部分中文乱码问题。 5.优化好友列表右键菜单。 6.将窗体自定义系统按钮改为集合模式,可添加无数个自定义系统按钮。自定义系统按钮事件中可以 e.参数 来判断。 7.增加360安全卫士-DEMO案例。 8.增加SkinAnimatorImg控件,用于支持位图动画的播放。如360的动态logo。 9.各种细节BUG优化。 CC2013-10.11 1.添加SkinTabControlEx,加入更加自定义的美化属性和动画效果。 2.添加SkinAnimator,通用动画控件。 3.添加Html编辑器控件 4.修复SkinButton图标和文本相对位置的BUG CC2013-9.26 1.优化好友列表CPU占用 2.好友列表加入好友登录平台属性:安卓 苹果 WEBQQ PC 3.优化标题绘制模式,新添标题绘制模式属性。 4.新添标题偏移度属性。 5.加入圆形进度条控件:ProgressIndicator。 CC2013-9.5.2 1.优化截图控件,截图工具栏加入新功能。 2.解决个人信息卡和天气窗体显示后不会消失的问题。 3.各种细节BUG优化。 CC2013-9.5.1 1.解决贴边左右隐藏的BUG。 2.解决窗体点击事件不能触发的问题。 3.优化SkinButton继承父容器背景色的代码。 4.解决SkinButton异常错误。 CC2013-9.3 1.好友列表右键菜单没反应问题。 2.新增美化控件SkinDatagridview。 3.密码软件盘回删不了文字问题。 4.双击窗体最大化,最大化后再双击恢复原大小,(win7)。 5.部分细节调优。 小编:下载不要分,DEMO教你如何熟练使用CSkin界面库美化自己的窗体。 友情链接: http://bbs.csdn.net/topics/390510544 (精仿QQ2013局域通讯) http://download.csdn.net/detail/lyx_520/5710799 (C#实现Win8窗体)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧