溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

關(guān)于WinCE開發(fā)的一些心得(2)

發(fā)布時(shí)間:2020-08-05 15:54:19 來源:網(wǎng)絡(luò) 閱讀:1597 作者:270jia40 欄目:編程語言

       嗯,上周沒寫,在書店看了一夜的書,第二天睡了一天。

       最近項(xiàng)目開發(fā)的差不多了(其實(shí)是在沒有服務(wù)和設(shè)備的情況下開發(fā)程序......),不過還好這兩天設(shè)備終于到了。

       就目前的開發(fā)情況自問自答的寫一點(diǎn)心得,這其中一部分可以用于Winform開發(fā)。


問:關(guān)于DataGrid的使用和重繪

答:這個(gè)在之前的文章中給了一位大神重繪DataGrid的示例,本來我也想也一個(gè)差不多的然后放上來,不過看起來又要延后了關(guān)于WinCE開發(fā)的一些心得(2)關(guān)于WinCE開發(fā)的一些心得(2)。


問:如何實(shí)現(xiàn)輸入指定文本(如只接受數(shù)字,只接受正整數(shù)等),并在有錯(cuò)誤輸入的時(shí)候能夠回退到輸入之前的狀態(tài)

答:首先頁(yè)面要有一個(gè)緩存變量,然后在文本框的Text_Change事件里對(duì)緩存變量賦值,在有錯(cuò)誤輸入的時(shí)候?qū)⒕彺孀兞抠x值給文本框,就能實(shí)現(xiàn)回退

        //全局緩存變量
        private string strtextbox1 = string.Empty;
        //文本改變事件
        private void textBox1_TextChanged(object sender, EventArgs e)
        {   //判斷是否為正整數(shù)
             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設(shè)備上掃描到的數(shù)據(jù)

答:就目前我所知道的有兩種,一種是通過硬件廠商提供的SDK,通過掃描事件獲得數(shù)據(jù),這個(gè)方法的缺點(diǎn)是一旦更換成不同品牌的掃描設(shè)備就要修改代碼,所以非常麻煩;另一種就是焦點(diǎn)獲取數(shù)據(jù),這種是最簡(jiǎn)單的,最方便的(我是這樣認(rèn)為的),這個(gè)功能由硬件廠商提供,當(dāng)掃描功能開啟時(shí),掃描到的數(shù)據(jù)會(huì)直接注入到目前焦點(diǎn)所在的地方(例如目前選中的文本框),如果沒有焦點(diǎn),一般會(huì)出現(xiàn)一個(gè)Demo,提示你無需調(diào)用SDK就可以將獲取數(shù)據(jù)之類的說明,其具體的原理,貌似是和鍵盤輸入一樣。這個(gè)方法的問題在于控件焦點(diǎn)的控制。


問:掃描到的數(shù)據(jù)是怎么注入到文本框中的?

答:就目前我所知道的情況,和鍵盤輸入一樣,是一個(gè)一個(gè)字符添加到文本框的,所以每添加一次就會(huì)觸發(fā)一次Text_Change事件,例如掃描到的數(shù)據(jù)是一個(gè)長(zhǎng)度為10的字符串,就會(huì)觸發(fā)10次Text_Change事件。


問:對(duì)于掃描到的數(shù)據(jù)的控制

答:因?yàn)槟壳绊?xiàng)目中要求掃描到的數(shù)據(jù)必須經(jīng)過后臺(tái)轉(zhuǎn)換才能顯示,所以,不能直接顯示掃描到的數(shù)據(jù)。目前我的解決方法有兩個(gè)。不過首先要設(shè)置掃描器在每次掃描的結(jié)果后面加一個(gè)回車鍵,這樣代表結(jié)束,便于判斷。

一個(gè)方法是在文本框的Text_KeyPress事件中判斷輸入的字符是不是回車鍵,如果是,則獲得文本框數(shù)據(jù),然后到后臺(tái)查詢轉(zhuǎn)換成對(duì)應(yīng)的數(shù)字,然后將該數(shù)值賦值到文本框中,所有操作在事件中進(jìn)行,這個(gè)方法的確定是,如果后臺(tái)服務(wù)比較卡,可能會(huì)導(dǎo)致客戶看到不應(yīng)該顯示的數(shù)據(jù)。

另一個(gè)則是我從網(wǎng)上查到的,首先將頁(yè)面的KeyPreview設(shè)置為true,然后在頁(yè)面上的KeyPress事件中捕獲篩選所需的文本。這樣做的好處是只有在全部處理結(jié)束后才顯示文本,不會(huì)讓客戶看到錯(cuò)誤的數(shù)據(jù)。

        //處理掃描數(shù)據(jù)的方法
        private string Handle(string str)
        {
            return str;
        }
        //全局緩存變量
        private string strtextbox2 = string.Empty;
        //窗體按鍵事件
        private void Form1_KeyPress(object sender, KeyPressEventArgs e)
        {   //判斷是否是指定控件處于焦點(diǎn)狀態(tài)
            if (this.textBox2.Focused)
            {   //判斷輸入的是不是回車鍵
                if (e.KeyChar == (char)Keys.Enter)
                {   //對(duì)迄今為止獲得的緩存數(shù)據(jù)傳回后臺(tái)處理
                    //然后賦值給頁(yè)面顯示
                    this.textBox2.Text = Handle(strtextbox2);
                    //清空緩存
                    strtextbox2 = string.Empty;
                }
                else
                {   //累積添加到緩存變量中
                    strtextbox2 += e.KeyChar;
                }
                //代表事件到此結(jié)束,不在向下傳遞
                e.Handled = true;
            }
        }


好吧,暫時(shí)先這樣,以后想到什么再補(bǔ)充。


認(rèn)真活好每一天!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI