C#用户控件的一些尝试

在设计完控件后,想要建立一个Windows窗体程序进行测试,但是一双击用户控件Visual 2013就停止运行,后面发现应该要先在Windows窗体项目应用中添加控件的引用,然后重新生成整个解决方案,问题就解决了。

但接下来又产生了另一个问题,那就是控件在设计调用的时候显示不完全(我的控件里是组合了label和textbox两个控件的组合控件),我发现是我理解的方法调用含义不对,labelTest.Top代表的不是label顶端的位置,而是控件顶端与容器顶端的距离,所以当令labelTest.Top=0时,控件的上端就会与容器的上端对齐,以此解决了显示不全的问题。下面是整个控件的代码,实现了两个属性和设计时改变容器大小,内部复合控件进行重绘:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections;

namespace WindowsFormsControlLibrary1
{
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}

private void UserControl1_Load(object sender, EventArgs e)
{
labelTest.Text = Name; // 设置静态文本
textBoxTest.Left = labelTest.Right; // 静态文本右端对齐文本框左端
textBoxTest.Width = Width - labelTest.Right - 3; // 文本框宽度
}

public enum PositionEnum
{
Right,
Below
}
private PositionEnum Position = PositionEnum.Right;
private int TextBoxMargin = 0;

public PositionEnum getPosition
{
get { return Position; }
set
{
Position = value;
MoveControls();
}
}

public int getTextboxMargin
{
get { return TextBoxMargin; }
set
{
TextBoxMargin = value;
MoveControls();
}
}

private void MoveControls()
{
switch (Position)
{
case PositionEnum.Below:
labelTest.Top = 0;
labelTest.Left = 0;
textBoxTest.Top = labelTest.Bottom;
textBoxTest.Height=Height-labelTest.Bottom;
textBoxTest.Left = 0;
textBoxTest.Width = Width - labelTest.Right - 3;
//Height = textBoxTest.Height + labelTest.Height;
break;
case PositionEnum.Right:
labelTest.Left = 0;

if (TextBoxMargin == 0)
{
textBoxTest.Left = labelTest.Right; // 静态文本右端对齐文本框左端
textBoxTest.Width = Width - labelTest.Right - 3; // 文本框宽度
}
else
{
textBoxTest.Left = labelTest.Right+TextBoxMargin; // 静态文本右端对齐文本框左端
textBoxTest.Width = Width - labelTest.Right - 3; // 文本框宽度
}
//textBoxTest.Height = Height;
break;
}
}

private void UserControl1_SizeChanged(object sender, EventArgs e)
{
MoveControls();
}

}
}

显示的结果是:

拉伸后变成这样:

最后还是没有符合自己的预期,我想的是在设计时拉伸容器可以让内部的控件高和宽都进行等比例转换,可是总不能成功,中间借鉴了网上一些人的想法,改变控件的Anchor和Dock属性,但效果不好(估计自己没用对),只能让控件钉住随区域移动,但大小还是没变化,期待后续解决。。。

C#用户控件的一些尝试,布布扣,bubuko.com

时间: 2024-10-24 10:05:34

C#用户控件的一些尝试的相关文章

VB.Net中用户控件的使用

机房重构时,在界面的制作上有这样一个需要改进的地方.那就是在判断窗体上所有文本框时候为空的时候,弹出提示信息的问题.先看一下原先的代码: <pre name="code" class="vb"> Public Function IsEmptyText(ByVal objs As Form) As Boolean '遍历窗体中所有的控件 For i As Integer = objs.Controls.Count - 1 To 0 Step -1 '判断是

用户控件与页面间相互给各自的控件赋值

用户控件 ->页面 ((Label)this.Parent.Page.FindControl("AAA")).Text = "ABC"; AAA:页面控件ID Label:页面控件类型 页面 -> 用户控件 ((HiddenField)POPUSER_1.FindControl("hidNO")).Value = "VNBB"; POPUSER_1:用户控件ID HiddenField:用户控件中需要处理的控件的类

用户控件,动态创建添加用户控件

用户控件的制作步骤 1,新建一个项目,文件>新建>项目. 2,添加>新建项>用户控件.文件类型为.cs 使用用户控件 在用户控件设计业点击工具栏中的生成项,选择第一项生成解决方案,或直接点F6: 生成成功后在windows窗体的工具栏最顶端就会显示此用户控件 动态添加控件 输入一个值为n,点击按钮,动态生成n个按钮,并编号号 private void button1_Click(object sender, EventArgs e) { //先获取用户输入的是几 int count

WinForm用户控件、动态创建添加控件、timer控件--2016年12月12日

好文要顶 关注我 收藏该文 徐淳 关注 - 1 粉丝 - 3 0 0 用户控件: 通过布局将多个控件整合为一个控件,根据自己的需要进行修改,可对用户控件内的所有控件及控件属性进行修改使用 动态创建添加控件: 1 //定义控件类型 2 Button btn = new Button(); 3 //控件名称……等属性,也可以直接绑定各种事件 4 btn.Name = "mybutton" + i.ToString(); 5 //添加到窗体 this 可以替换为 容器控件 6 this.Co

无边框窗体和用户控件以及权限

无边框窗体: 就是吧窗体的边框去掉,然后自己做按钮设置功能. 无边框窗体的移动: 将下面代码直接复制粘贴,将窗体的鼠标按下事件的方法改成下面方法的名字就可以直接使用 1 //窗体移动API 2 [DllImport("user32.dll")] 3 public static extern bool ReleaseCapture(); 4 [DllImport("user32.dll")] 5 public static extern bool SendMessag

js清空web用户控件的值

假设你的用户控件里面有: <asp:DropDownList ID="DropDownList1" runat="server"> <asp:ListItem Text="111" Value="111"></asp:ListItem> </asp:DropDownList> 然后你在aspx页面中注册这个控件: <%@ Register Src="~/WebUs

用户控件(二)--常见4 种路径问题解决:

二.路径:1.问题: 添加到用户控件中的图片以及超链接 都会有固定的路径,当将用户控件用到其他页面中后,对应的页面路径需要发生变化,否则无法正常作用显示:解决: 在添加到用户控件中的 HTML 标记或者标准控件中添加:runat= server id=“id名”:这样服务端会根据使用情况自动更正图片或者超链接路径:注意: 超链接可以直接使用标准控件:Hyperlink 它里面直接带 runat=server: 2.问题?样式表中值的路径:(例)background-image:url(路径) 解

winfrom获取用户控件里的控件对象

如何获取用户控件里的控件对象呢,其实思路也是很简单的, 比如有一个panel 用户控件 里面有许多的其他控件. 那么要找出一个Label控件怎么找呢,好的.现在我们就开始 首先,一个foreach循环获得所有控件. 然后根据类型筛选出这个类型的所有控件.然后就可以用Name来判断了 foreach(var lb in mi_image1.Controls) {    if (lb is Label)    {         Label obj = lb as Label;   //如果把循环改

028.用户控件、生命周期

1.控件父类型ControlFindControl(寻找子控件)Controls 子控件集合 2.AutoPostBack 允许自动回发作用:允许控件向服务器端提交请求 3.生命周期:页面对象从创建到销毁的过程,也就是处理请求的过程.在Page_Load()中需要判断IsPostBack 4.错误处理页面级别:当前页面的错误全局:整个应用程序的错误配置文件:整个应用程序错误,不能捕获异常,只能转向. 5.用户控件(自定义的服务端控件)目的:重用界面元素及代码<%--注册用户控件,Src指向控件,