winform动态生成控件的几个问题

祭礼 2010-06-11 06:21:56
请问一下
1.我在winfrom 里面 自动用循环生成了 若干个自定义控件 然后用代码给它做了 右键菜单 现在出现了一个问题 就是 我如何判断 我在哪个控件里面点的右键 或者 如何得到我所右击的控件里面的内容

2 我的自定义控件 比较简单 一个图片框 两个 Label
|-----|Label 1
|图片 |
|-----|Label 2
外形和上面那个差不多 可是 由于Label 2 中 内容比较多 所以我希望 Label 2 在达到特定长度 或者字数的时候 自动换行 请问该怎么做

...全文
315 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
slamz 2010-06-12
  • 打赏
  • 举报
回复
Sender 的判断要在鼠标点击事件的处理函数里
大概是
MouseClick_EventHandler(Object Sender,EventArgs e){
ListUser lu = Sender as ListUser;
}
祭礼 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 slamz 的回复:]
dock是有覆盖作用的,所以要使用dock布局,记得用多层panel来分布好结构。因为没看到你的界面不好分析。
并且用dock功能,就必须将autosize设成false及AutoEliipsis=true。


第一个很简单,sender就是你点击时点到的那个控件,如果是你自己定义的控件:

YourControl c = Sender as YourControl;
[/Quote]

第二个 差不多搞定了 我直接拿控件像素的大小 计算插入换行符的位置

第一个 不明白 这里是我的代码
public void pageAs(string url)
{
tpLookAround.Controls.Clear();
string xml = ServerlLink.SLink("post", url);
getPage get = new getPage();
List<LookAround> listWeb = get.page(xml);
int z = 0;
for (int i = 0; i < listWeb.Count; i++)
{

ListUser list = new ListUser();
list.Top = z;

list.Name1 = listWeb.User.Name; ;
list.Text1 = listWeb.Text;
list.ProfileImageUrl = listWeb.User.ProfileImageUrl;

ContextMenuStrip cms = new ContextMenuStrip();

cms.Items.Add("收藏" + list.Id, null, delegate { rel = ServerlLink.SLink("post", *****这里需要值******); });
cms.Items.Add("转发" + list.Id, null, delegate { rel = ServerlLink.SLink("post", *******这里需要值*******); });

this.ContextMenuStrip = cms;
tpLookAround.Controls.Add(list);
z += list.Height + 3;
}
}


ListUser 是自定义控件的名字
slamz 2010-06-11
  • 打赏
  • 举报
回复
dock是有覆盖作用的,所以要使用dock布局,记得用多层panel来分布好结构。因为没看到你的界面不好分析。
并且用dock功能,就必须将autosize设成false及AutoEliipsis=true。


第一个很简单,sender就是你点击时点到的那个控件,如果是你自己定义的控件:

YourControl c = Sender as YourControl;
祭礼 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 slamz 的回复:]
这种情况下,如果大小是可变的,建议你将label的dock改成fill或者bottom,应该能解决
[/Quote]

我的意思是 按照你刚刚的说法 在指定位置 插入 换行符 这样的话 控件大小变更以后 依旧会在同样的位置换行
label 的 dock 设置成fill 会莫名奇妙的覆盖掉我文本框 不知到是不是我其他地方 弄错了 自定义控件的 dock fill 自定义控件 放在 SplitContainer 里面 SplitContainer 面板的大小可以调节 调节以后 还是会在同样的地方换行。。。。。

话说 问题一的 那个 是否可以给我个实例

slamz 2010-06-11
  • 打赏
  • 举报
回复
这种情况下,如果大小是可变的,建议你将label的dock改成fill或者bottom,应该能解决
祭礼 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 liyulongok 的回复:]
引用 4 楼 slamz 的回复:
居然没看到你第二个问题

取消掉autosize后设置AutoEliipsis=true,这样超出部分会省略为...

如果想全部显示而不省略任何内容,你只能在指定字数后插入换行符

也可以用textbox取代label,隐藏textbox的边框和设置背景色,能完全模拟出label效果。


刚刚用了你的方法 可行 可是带来了一个问题 那就是……
[/Quote]

用户更改控件的大小、、、、、
祭礼 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 slamz 的回复:]
居然没看到你第二个问题

取消掉autosize后设置AutoEliipsis=true,这样超出部分会省略为...

如果想全部显示而不省略任何内容,你只能在指定字数后插入换行符

也可以用textbox取代label,隐藏textbox的边框和设置背景色,能完全模拟出label效果。
[/Quote]

刚刚用了你的方法 可行 可是带来了一个问题 那就是 我的自定义控件 是可以改大小的。。。。。根据字数插换行符的话 控件大小一改 就没用了。。。。。
wuyq11 2010-06-11
  • 打赏
  • 举报
回复
调用同一事件
Label l =sender as Label;
Environment.NewLine
label1.Height = rows * 20;//
slamz 2010-06-11
  • 打赏
  • 举报
回复
居然没看到你第二个问题

取消掉autosize后设置AutoEliipsis=true,这样超出部分会省略为...

如果想全部显示而不省略任何内容,你只能在指定字数后插入换行符

也可以用textbox取代label,隐藏textbox的边框和设置背景色,能完全模拟出label效果。

祭礼 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 computerfox 的回复:]
1、第一个问题,可以判断事件的sender参数。typeof sender来判断。

2、可以设置Size,然后AutoSize=false,把label拉得高一点。
[/Quote]

问题2 我现在 不能提前确定 Label 2 里面 会输入多少字 范围 大概是 1 - 200 的字数 如果直接拉label 会导致 在内容少的时候 很难看 是否可以根据其 字数的多或少 来自动调整其大小
捷哥1999 2010-06-11
  • 打赏
  • 举报
回复
1、第一个问题,可以判断事件的sender参数。typeof sender来判断。

2、可以设置Size,然后AutoSize=false,把label拉得高一点。
slamz 2010-06-11
  • 打赏
  • 举报
回复
判断事件函数里的sender就好了

110,536

社区成员

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

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

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