自定义控件
在开发Wince的过程中使用到了有多个输入框,在这些输入框都输入值后将这些输入框的值传递到DataGrid中的需求,心想这种东西以后还会用,正好也学习一下Winform用户控件的用法,就把它写成了一个控件
实现效果图和开发图(Wince的窗体界面比较难看...):
其中用红框框起来的是一个用户控件,目前实现的功能是根据传递的参数动态生成Label,Textbox,和GridView,也就是说使用的时候只需要给这个控件设置一个属性就行了
开发这个用户控件还是有点内容的,拿出来分享一下
1.在自定义控件的时候需要新增属性(ListHeaderStr),因为感觉这个属性能显示在可视开发界面的属性栏里,感觉应该比较复杂,其实,只要直接在用户控件类中新增属性就行了
public string ListHeaderStr { get; set; }
想引用刚刚创建的用户控件到Vs的工具栏中需要在“工具栏”中点击右键选择“选择项”,引入用户控件编辑过的exe或dll文件
2.因为自定义了用户控件,所以在使用这个用户控件的时候,无法直接控制控件中的Textbox或其他控件的属性,如下一个自定义控件:
只是定义了一个输入框,在自定义的控件中对KeyDown事件做了一些处理,让其能够在用户点击回车键的时候能够转换到下一个输入框(类似于Tab)但是手持机上没有Tab键,只有OK(回车),所以就有了这个控件,但是当用户需要对该控件做其他处理,如:需要捕获该输入控件的LostFocus,KeyDown等事件时,如果直接使用InBox.LostFocus或Inbox.KeyDown(Inbox 是自定义控件名),用户其实是捕获不到的,因为用户的真正需求应该是捕获Inbox中的TextBox的这些事件,所以直接用于控件上无法捕获,这里我使用重写事件的方法,在自定义的控件中加上如下事件:
public event EventHandler LostFocus;
public event EventHandler<KeyEventArgs> KeyDown;
大家可以看出,这些时间是和Control中的事件重名的,对这些时间进行了重写。
然后在Inbox中的Textbox的事件被激发时,激发我重写的事件,来把这种影响传递下去
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
KeyDown(this, e);
}
private void textBox1_LostFocus(object sender, EventArgs e)
{
if (LostFocus != null)
{
LostFocus(sender, e);
}
}