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

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

目前创新互联建站已为上千的企业提供了网站建设、域名、雅安服务器托管网站运营、企业网站设计、祁东网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

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

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

问:关于DataGrid的使用和重绘

答:这个在之前的文章中给了一位大神重绘DataGrid的示例,本来我也想也一个差不多的然后放上来,不过看起来又要延后了关于WinCE开发的一些心得(2)关于WinCE开发的一些心得(2)

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

答:首先页面要有一个缓存变量,然后在文本框的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;
            }
        }

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

认真活好每一天!


本文名称:关于WinCE开发的一些心得(2)
文章链接:http://hbruida.cn/article/psipsp.html