牛人们,请进来,关于控件的设计时高级话题!帮帮我

youzelin 2008-10-18 09:56:32
各位,我现在碰到控件的一个设计问题,此问题是这样的:

首先,我自定一个 UserControl,名为 MyUserControl,里面包含一个 Panel,名为 panel1,panel1.BorderStyle = Fixed3D。
接着,生成之后从工具栏上将 MyUserControl 拖放至 Form1 中。


我的问题出来了:

我现在需要在设计时(DesignTime),能够选中在 Form1 中的 MyUserControl 的子控件 panel1,
并且允许从工具栏上将控件拖放至 Panel1 当中
此设计估计一定会用到 ControlDesigner,但是我不知道如何做,网上找了很久,找不到,我恳请各位高手帮帮我,帮我指点一二!

谢谢!
...全文
385 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
hch126163 2011-04-18
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 wartim 的回复:]

UserControl1:

C# code

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using S……
[/Quote]

学习了
dodducs 2011-04-18
  • 打赏
  • 举报
回复
我过我说的这种是做类似于VS的这种软件有工具栏的,然后用户可以拖动工具栏里的控件到自己做好的UserControl里,不清楚你是不是要这个?还是说就是在编写代码的时候现实?
如果是后者的话,那我的办法肯定就不好用了……
dodducs 2011-04-18
  • 打赏
  • 举报
回复
选中 我没做过,但是动态往UserControl里加控件我有做过,是可行的。
Controls 这个属性有个 Add 往里加就行了。
这个不是想当然的,我确实有做过,不过过去半年多了有点忘了,你好好琢磨下,动态加控件是可以的


后来想起来了,我头段时间机试也用过UserControl动态加控件。。。。
就用的Controls.Add
SecretGarden 2011-04-17
  • 打赏
  • 举报
回复
我在论坛上见过很多奇怪的和不合理的需求,但是这个帖子提出的是一个完全合理的需求,不过很多人不太懂所以说不可能。
无论是 User Control 或是 Custom Control,都可以成为 Parent Control,Parent Control 不是容器控件,Parent Control 是指 Visual Studio 设计器支持的控件,可以在设计时接受控件(通过用户拖放操作)。要实现它,必须为控件编写特定的控件设计器类,且该类继承自 ParentControlDesigner 类。

参考代码片段:
public class ControlDemoDesigner : ParentControlDesigner
{
// 这是关键的重载方法
public override bool CanParent(Control control)
{
if (control is Button) return true; // 允许在控件上放置 Button 控件
return false;
}
}
SecretGarden 2011-04-17
  • 打赏
  • 举报
回复
请详看我的代码,最终目标是不一样的。如果你希望获得更多的控制,比如只允许放置特定的控件类型,或者只允许在特定的区域放置控件...等等,恐怕不是越“简单”越好

[Quote=引用 40 楼 isjoe 的回复:]
引用 39 楼 secretgarden 的回复:
我在论坛上见过很多奇怪的和不合理的需求,但是这个帖子提出的是一个完全合理的需求,不过很多人不太懂所以说不可能。
无论是 User Control 或是 Custom Control,都可以成为 Parent Control,Parent Control 不是容器控件,Parent Control 是指 Visual Studio 设计器支持的……
[/Quote]
isjoe 2011-04-17
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 secretgarden 的回复:]
我在论坛上见过很多奇怪的和不合理的需求,但是这个帖子提出的是一个完全合理的需求,不过很多人不太懂所以说不可能。
无论是 User Control 或是 Custom Control,都可以成为 Parent Control,Parent Control 不是容器控件,Parent Control 是指 Visual Studio 设计器支持的控件,可以在设计时接受控件(通过用户拖放操作)。要实现……
[/Quote]


[Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(IDesigner))] public class UserControl1 :UserControl
这样更简单
youzelin 2009-03-03
  • 打赏
  • 举报
回复
HELP!!
youzelin 2008-10-25
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 wartim 的回复:]
UserControl1:


C# code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.Design; // 在这里using前要先添加引用“System.Design”

namespace WindowsControlLibrary2
{
[Designer(typeof(UserControlDesigner))]
public partial class UserCo…
[/Quote]

谢谢,感谢 wartim ,不过还是会有以下几个问题:

(1) 这样一来,在设计时,在 Form1 中,我无法将其它的控件直接拖入至 UserControl1,只能将控件拖入至 panel1
(2) 在 Form1 中,我竟然可以把 panel1 拖到 UserControl1 的外面,这个好像不太好吧?

wartim 2008-10-25
  • 打赏
  • 举报
回复
这样就能通过panel1的Controls找控件,而内部的panel1对外名字就是ContentArea
this.userControl11.ContentArea.Controls["button1"].Text = "panel1button1";

实际上,要在vs设计期可以设计用户控件内部panel, 事实上是类似声明了一个外部控件,来操控用户控件的内部控件
wartim 2008-10-25
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 Leon110 的回复:]
怎么往这个panel1里面添加控件啊,怎么我加的都是属于Form1的啊
[/Quote]

我改了下,需要重新编译控件,删掉form1上老的再拖个进来就能看到效果了
在vs设计期间,拖控件到panel上自动绑定到panel1上


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.Design; // 在这里using前要先添加引用“System.Design”

namespace WindowsControlLibrary2
{
[Designer(typeof(UserControlDesigner))]
public partial class UserControl1 : UserControl
{
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public Panel ContentArea
{
get
{
return panel1; // 在上面放一个Panel,名字叫 panel1
}
}

public UserControl1()
{
InitializeComponent();

// 我这里的设置只是让panel更醒目点
this.Size = new Size(700, 700);
this.BackColor = Color.Gray;
panel1.Size = new Size(500, 500);
panel1.ForeColor = Color.Black;
panel1.Parent = this;
}

private void panel1_ControlAdded(object sender, ControlEventArgs e)
{
e.Control.Parent = panel1; // 加了个事件,指定拖进来的控件绑定到控件内部的panel1上去
}
}

public class UserControlDesigner : ControlDesigner
{
public override void Initialize(System.ComponentModel.IComponent Ic)
{
base.Initialize(Ic);
UserControl1 UC = (UserControl1)Ic;
EnableDesignMode(UC.ContentArea, "ContentArea");
}
}
}

youzelin 2008-10-25
  • 打赏
  • 举报
回复
(3) 还有一点,无论我在 panel1 中加入多少控件,一运行,什么都没了,而且结束运行后,切换至 Form1,原先添加到 panel1 的控件都没了
wartim 2008-10-24
  • 打赏
  • 举报
回复
UserControl1:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.Design; // 在这里using前要先添加引用“System.Design”

namespace WindowsControlLibrary2
{
[Designer(typeof(UserControlDesigner))]
public partial class UserControl1 : UserControl
{
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public Panel ContentArea
{
get
{
return panel1; // 在上面放一个Panel,名字叫 panel1
}
}

public UserControl1()
{
InitializeComponent();

// 我这里的设置只是让panel更醒目点
this.Size = new Size(700, 700);
this.BackColor = Color.Gray;
panel1.Size = new Size(500, 500);
panel1.ForeColor = Color.Black;
}
}

public class UserControlDesigner : ControlDesigner
{
public override void Initialize(System.ComponentModel.IComponent Ic)
{
base.Initialize(Ic);
UserControl1 UC = (UserControl1)Ic;
EnableDesignMode(UC.ContentArea, "ContentArea");
}
}
}
CTZYLY 2008-10-24
  • 打赏
  • 举报
回复
up
EriclLee 2008-10-24
  • 打赏
  • 举报
回复
我用这怎么不行呢
是是非非 2008-10-24
  • 打赏
  • 举报
回复
看字面意思,有点像做一个“容器控件” 参考这篇文章

http://support.microsoft.com/kb/813450
gtiroy 2008-10-24
  • 打赏
  • 举报
回复
我建议你用master.page
EriclLee 2008-10-24
  • 打赏
  • 举报
回复
怎么往这个panel1里面添加控件啊,怎么我加的都是属于Form1的啊
EriclLee 2008-10-24
  • 打赏
  • 举报
回复
中国这么大,人口这么多,总是有能人的,只要舍得分享,特别是创意,中国何愁发展不起来了呢
绿色夹克衫 2008-10-24
  • 打赏
  • 举报
回复
从容器类里面继承呀!别从usercontrol继承.

不过拖到你控件的panel里面会有问题,拖到你的控件里是可能的。
yinrongg 2008-10-24
  • 打赏
  • 举报
回复

这是个好思路
加载更多回复(24)

110,536

社区成员

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

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

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