目录
1 新建自定义控件工程
1.1 工程创建
1.2 透明背景
1.3 添加自定义属性
1.4 性别判定控件代码
2 自定义控件选择需要的随机字符串
2.1 自定义控件代码
2.2 弹出的窗体代码
2.3 效果展示
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace sexControl
{
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}
//prop Tab自定义生成属性
[Browsable(true)]//表示该属性会显示在属性窗口中
//Description 指定属性或事件的说明
//Category 自定义属性的分组名称
//DefaultValue 指定属性的默认值,默认值不加粗,非默认值会加粗
[Description("默认选中的复选框,int型,索引从0开始,0是代表第一个复选框"),Category("自定义属性"), DefaultValue(-1)]
public int CheckIndex { get; set; }
private void UserControl1_Load(object sender, EventArgs e)
{
if (CheckIndex == 0)
{
checkBoxMan.Checked = true;
checkBoxWoman.Checked = false;
}
else if (CheckIndex == 1)
{
checkBoxMan.Checked = false;
checkBoxWoman.Checked = true;
}
else {
checkBoxMan.Checked = false;
checkBoxWoman.Checked = false;
}
}
private void checkBoxWoman_CheckedChanged(object sender, EventArgs e)
{
if (checkBoxWoman.Checked == true)
{
checkBoxMan.Checked = false;
}
else
{
checkBoxMan.Checked = true;
}
}
private void checkBoxMan_CheckedChanged(object sender, EventArgs e)
{
if (checkBoxMan.Checked == true)
{
checkBoxWoman.Checked = false;
}
else
{
checkBoxWoman.Checked = true;
}
}
}
}
新建自定义控件:拖入一个textBox和一个button
新建名称为FrmPop的窗体,在窗体中拖入ListBox控件,Dock属性设置为Fill
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace sexControl
{
public partial class PopControl : UserControl
{
public static string guidValue;
public PopControl()
{
InitializeComponent();
}
[Browsable(true)]//表示该属性会显示在属性窗口中
[Description("设置显示窗体的宽度"), Category("自定义属性"), DefaultValue(30)]
public int PopWidth { get; set; }
[Description("设置显示窗体的高度"), Category("自定义属性"), DefaultValue(60)]
public int PopHeight { get; set; }
[Description("设置显示窗体的文本"), Category("自定义属性"), DefaultValue("")]
public string PopText { get; set; }
private void btnOk_Click(object sender, EventArgs e)
{
FrmPop fpop = new FrmPop(PopWidth, PopHeight, PopText);
fpop.ShowDialog();
textBoxNode.Text = guidValue;
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace sexControl
{
public partial class FrmPop : Form
{
public FrmPop(int width, int height, string text)
{
InitializeComponent();
//改变窗体的大小,如果不知道怎么该直接去*.Designer.cs文件中拷贝
this.Size = new System.Drawing.Size(width, height);
this.Text = text;
}
private void FrmPop_Load(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++)
{
//用来生成全球唯一的32的字符串
string s = Guid.NewGuid().ToString();
listBoxGuid.Items.Add(s);
}
}
private void listBoxGuid_DoubleClick(object sender, EventArgs e)
{
//获取当前选中项的值
PopControl.guidValue = listBoxGuid.SelectedItem.ToString();
this.Close();
}
}
}
界面:
运行:双击窗体中随机字符串,窗体关闭同时,会显示在自定义控件的文本框中
亮点及要点
附注: 静态与非静态
静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量。
在声明一个类时使用static关键字,具有两个方面的意义:
静态类中只能定义静态成员【属性或方法】,不能定义实例成员;密封的
使用的时候只能是根据类名调用,不能使用 new 关键字
非静态中可以声明静态类成员,使用的时候就用类名调用;其他成员需要实例化之后再使用。
应用场景:
一个类的成员和它所在的类的实例化对象无关,不依赖 new 的实例;不需要面向对象的开发,如DBhelp和数据库通讯
高并发情形下,静态成员可能出错
生存周期:
静态成员从程序启动执行到类文件,一直到程序关闭一直存在;非静态只是在实例化才开始实例化
静态内存是整块的,非静态的内存是破碎的
R参考资料
C#超越菜鸟第九课:静态与非静态