当前位置:首页 > Windows程序 > 正文

关于WinCE开发的一些心得(2)

2021-03-25 Windows程序

       嗯,上周没写,在书店看了一夜的书,第二天睡了一天。

       最近项目开发的差不多了(其实是在没有服务和设备的情况下开发程序......),不过还好这两天设备终于到了。

       就目前的开发情况自问自答的写一点心得,这其中一部分可以用于Winform开发。


问:关于DataGrid的使用和重绘

答:这个在之前的文章中给了一位大神重绘DataGrid的示例,本来我也想也一个差不多的然后放上来,不过看起来又要延后了

技术分享


问:如何实现输入指定文本(如只接受数字,只接受正整数等),并在有错误输入的时候能够回退到输入之前的状态

答:首先页面要有一个缓存变量,然后在文本框的Text_Change事件里对缓存变量赋值,在有错误输入的时候将缓存变量赋值给文本框,就能实现回退

        //全局缓存变量         private string strtextbox1 = string.Empty;         //文本改变事件         private void textBox1_TextChanged(object sender, EventArgs e)         {   //判断是否为正整数              if (!string.IsNullOrEmpty(this.textBox1.Text)               && !Regex.IsMatch(this.textBox1.Text, @"^[0-9]\d*$"))             {   //退回                 this.textBox1.Text = this.strtextbox1;                 MessageBox.Show("Error Input");             }             else             {   //赋值                 this.strtextbox1 = this.textBox1.Text;             }         }


问:如何获得WinCE设备上扫描到的数据

答:就目前我所知道的有两种,一种是通过硬件厂商提供的SDK,通过扫描事件获得数据,这个方法的缺点是一旦更换成不同品牌的扫描设备就要修改代码,所以非常麻烦;另一种就是焦点获取数据,这种是最简单的,最方便的(我是这样认为的),这个功能由硬件厂商提供,当扫描功能开启时,扫描到的数据会直接注入到目前焦点所在的地方(例如目前选中的文本框),如果没有焦点,一般会出现一个Demo,提示你无需调用SDK就可以将获取数据之类的说明,其具体的原理,貌似是和键盘输入一样。这个方法的问题在于控件焦点的控制。


问:扫描到的数据是怎么注入到文本框中的?

答:就目前我所知道的情况,和键盘输入一样,是一个一个字符添加到文本框的,所以每添加一次就会触发一次Text_Change事件,例如扫描到的数据是一个长度为10的字符串,就会触发10次Text_Change事件。


问:对于扫描到的数据的控制

答:因为目前项目中要求扫描到的数据必须经过后台转换才能显示,所以,不能直接显示扫描到的数据。目前我的解决方法有两个。不过首先要设置扫描器在每次扫描的结果后面加一个回车键,这样代表结束,便于判断。

一个方法是在文本框的Text_KeyPress事件中判断输入的字符是不是回车键,如果是,则获得文本框数据,然后到后台查询转换成对应的数字,然后将该数值赋值到文本框中,,所有操作在事件中进行,这个方法的确定是,如果后台服务比较卡,可能会导致客户看到不应该显示的数据。

另一个则是我从网上查到的,首先将页面的KeyPreview设置为true,然后在页面上的KeyPress事件中捕获筛选所需的文本。这样做的好处是只有在全部处理结束后才显示文本,不会让客户看到错误的数据。

        //处理扫描数据的方法         private string Handle(string str)         {             return str;         }         //全局缓存变量         private string strtextbox2 = string.Empty;         //窗体按键事件         private void Form1_KeyPress(object sender, KeyPressEventArgs e)         {   //判断是否是指定控件处于焦点状态             if (this.textBox2.Focused)             {   //判断输入的是不是回车键                 if (e.KeyChar == (char)Keys.Enter)                 {   //对迄今为止获得的缓存数据传回后台处理                     //然后赋值给页面显示                     this.textBox2.Text = Handle(strtextbox2);                     //清空缓存                     strtextbox2 = string.Empty;                 }                 else                 {   //累积添加到缓存变量中                     strtextbox2 += e.KeyChar;                 }                 //代表事件到此结束,不在向下传递                 e.Handled = true;             }         }


好吧,暂时先这样,以后想到什么再补充。


认真活好每一天!

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/67245.html