版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、利用C#制作一個(gè)仿IE地址欄的文本框利用IE上網(wǎng)時(shí),只要在地址欄中輸入幾個(gè)字母,與這幾個(gè)字母模糊匹配的地址就會(huì)自動(dòng)顯示出來(lái)供用戶選擇(如下圖),用戶通過(guò)按鍵盤(pán)上的上、下箭頭在已有選項(xiàng)中遍歷,找到自己需要的選項(xiàng)后,按回車(chē)鍵進(jìn)行選擇,也可以直接用鼠標(biāo)進(jìn)行操作,非常方便,我們?cè)诔绦蛑幸部梢岳眠@一功能,實(shí)現(xiàn)自動(dòng)提示,方便用戶輸入,下面就以一個(gè)實(shí)際例子介紹我在工作中是如何實(shí)現(xiàn)的。從上圖中可以看出,最佳的辦法似乎就是繼承ComboBox寫(xiě)一個(gè)控件,在TextChanged事件中,根據(jù)內(nèi)容變化決定是否應(yīng)拉下提示框,以及該提示什么內(nèi)容,在實(shí)際工作中我們發(fā)現(xiàn),ComboBox非常難以控制,如修改了Select
2、edIndex屬性后,會(huì)自動(dòng)產(chǎn)生TextChanged事件,造成死循環(huán)等等,雖然可以添加其他一些變量來(lái)標(biāo)記該文本改變是用戶引起的還是由程序引起的以進(jìn)行區(qū)別對(duì)待處理,但效果始終不理想,經(jīng)過(guò)反復(fù)試驗(yàn),最后選擇了文本框+列表框的方式,并做成控件庫(kù)供其他程序調(diào)用,效果很理想,其中,文本框接收用戶輸入,列表框提供選項(xiàng)讓用戶選擇。新建一個(gè)普通的windows應(yīng)用程序用來(lái)測(cè)試,不妨取名為T(mén)est吧,然后單擊菜單“文件”“添加項(xiàng)目”“新建項(xiàng)目(N)”,從彈出來(lái)的對(duì)話框選擇“windows控件庫(kù)”,將該項(xiàng)目和Test項(xiàng)目放在同一個(gè)文件夾中,不妨取名為“TextBoxExt”,該項(xiàng)目是本文的重點(diǎn)。在“解決方案資源
3、管理器” 中,右鍵單擊“TextBoxExt”項(xiàng)目,從彈出的菜單中選擇“屬性”,會(huì)彈出屬性配置對(duì)話框,在左上角的“配置(C)”中選擇“所有配置”,設(shè)置輸出路徑為“.output”,注意,該輸入有點(diǎn)特殊,兩個(gè)小數(shù)點(diǎn)+反斜杠+output,意思是當(dāng)前文件夾上一層的ouput文件夾(從VC過(guò)來(lái)的朋友可能比較熟悉這種方式),如下圖:編譯一下,在“我的電腦”或“資源管理器”中我們可以就可以看到與TextBoxExt文件夾同一級(jí)自動(dòng)創(chuàng)建了一個(gè)output文件夾,輸出的TextboxExt.dll乖乖地躺在這里:再來(lái)配置一下依賴(lài)性,點(diǎn)菜單“項(xiàng)目”“設(shè)置依賴(lài)性(D)”,設(shè)置項(xiàng)目Test取決于“TextBoxE
4、xt”,至此,開(kāi)發(fā)環(huán)境配置完畢。在“解決方案資源管理器” 中雙擊“UserControl1.cs”文件,再切換到代碼窗口中。為便于引用,我們將命名空間“namespace TextBoxExt”改為“namespace Tools”,由于本控件繼承于文本框,因此,將代碼public class UserControl1 : System.Windows.Forms.UserControlpublic UserControl1()InitializeComponent();修改為:public class TextBoxExt : System.Windows.Forms.TextBoxpriv
5、ate System.ComponentModel.Container components = null;public TextBoxExt()也就是說(shuō)將命名空間改為T(mén)ools,將類(lèi)名改為T(mén)extBoxExt,讓該類(lèi)繼承于System.Windows.Forms.TextBox,并修改相應(yīng)的構(gòu)造函數(shù)。編譯成功后,在“解決方案資源管理器中”雙擊項(xiàng)目“Test”的“Form1.cs”來(lái)切換到窗體設(shè)計(jì),在“工具箱”窗口中切換到“我的用戶控件”選項(xiàng)中,在空白處單擊右鍵,從彈出的菜單中選擇“添加/移出項(xiàng)”,接下來(lái)會(huì)彈出一個(gè)對(duì)話框,點(diǎn)“瀏覽”按鈕,找到剛才生成的控件庫(kù),如下圖:最后點(diǎn)“確定”按鈕,在“工
6、具箱”的“我的控件庫(kù)”中就多了一個(gè)“TextBoxExt”控件,同操作普通文本框控件一樣,在窗體上添加幾個(gè)該自定義控件??梢钥闯?,該文本框和平時(shí)使用的文本框目前完全一樣。切換到UserControl1.cs代碼設(shè)計(jì)窗口中,添加一個(gè)列表框變量,用于顯示提示:private System.Windows.Forms.ListBox m_lstShowChoice=null;添加一段代碼,用于響應(yīng)列表框鼠標(biāo)的MouseUp事件,也就是用戶通過(guò)單擊列表框進(jìn)行選擇: private void lstBox_MouseUp(object sender, System.Windows.Forms.Mouse
7、EventArgs e)ListBox box=(ListBox)sender;if(box.SelectedIndex>-1) && !this.ReadOnly)this.Text=box.SelectedItem.ToString();/選擇后文本框失去了焦點(diǎn),這里移回來(lái)this.Focus();添加鼠標(biāo)在列表框中移動(dòng)的事件,當(dāng)用戶在列表框中移動(dòng)鼠標(biāo)時(shí),根據(jù)鼠標(biāo)位置,自動(dòng)設(shè)置列表框當(dāng)前項(xiàng)。private void lstBox_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)ListBox
8、 box=(ListBox)sender;Point pt = new Point(e.X,e.Y);int n=box.IndexFromPoint(pt);if(n>=0)box.SelectedIndex=n;為了美觀,可以設(shè)置列表框的前景、背景、邊框風(fēng)格等,按常規(guī),我們可以設(shè)置一個(gè)public變量來(lái)供程序調(diào)用,但在程序設(shè)計(jì)時(shí)無(wú)法通過(guò)屬性窗口直接修改,不方便,通過(guò)“性質(zhì)”來(lái)引用可以解決,下面的代碼是設(shè)置列表框的背景,比較好理解:#region 設(shè)置提示框的背景private Color m_lstForColor=System.Drawing.SystemColors.InfoTe
9、xt;/ <summary>/ 設(shè)置/獲取提示的背景色/ </summary>public Color PromptBackColorgetreturn m_lstBackColor;setm_lstBackColor=value;/lstPrompt的創(chuàng)建見(jiàn)下面的代碼ListBox box=this.lstPrompt;if(box!=null)box.BackColor=m_lstBackColor;#endregion設(shè)置前景、邊框的方法完全一樣,不再贅述,經(jīng)過(guò)這樣處理,我們?cè)诔绦蛟O(shè)計(jì)時(shí)就可以直接在“屬性”窗口中指定了,如下圖:接下來(lái),也是通過(guò)“性質(zhì)”來(lái)返回當(dāng)前列
10、表框,如果沒(méi)有則創(chuàng)建:private System.Windows.Forms.ListBox lstPromptget/如果沒(méi)有列表用于顯示提示的列表框,則創(chuàng)建一個(gè)if(m_lstShowChoice=null) && this.Parent!=null)m_lstShowChoice=new ListBox();m_lstShowChoice.Visible=false;m_lstShowChoice.Left=this.Left;m_lstShowChoice.Top=this.Bottom;m_lstShowChoice.Width=this.Width;m_lstSh
11、owChoice.TabStop=false;m_lstShowChoice.Sorted=true;m_lstShowChoice.ForeColor=this.m_lstForColor; /前景m_lstShowChoice.BackColor=this.m_lstBackColor; /背景(參見(jiàn)m_lstForColor的創(chuàng)建m_lstShowChoice.BorderStyle=this.m_lstBordrStyle; /邊框,背景(參見(jiàn)m_lstForColor的創(chuàng)建/如果提示框過(guò)低,則顯示到上面if(m_lstShowChoice.Bottom>this.Parent.
12、Height)m_lstShowChoice.Top=this.Top-m_lstShowChoice.Height+8;m_lstShowChoice.MouseUp += new System.Windows.Forms.MouseEventHandler(this.lstBox_MouseUp);m_lstShowChoice.MouseMove+= new System.Windows.Forms.MouseEventHandler(this.lstBox_MouseMove);this.Parent.Controls.Add(m_lstShowChoice);this.Parent.
13、ResumeLayout(false);m_lstShowChoice.BringToFront();return m_lstShowChoice;創(chuàng)建一個(gè)ArrayList用于存放全部可供選擇的項(xiàng)目:private ArrayList m_ForChoice=new ArrayList();public ArrayList ChoiceArraygetreturn m_ForChoice;setm_ForChoice=(ArrayList)(value.Clone();ListBox box=this.lstPrompt;if(box!=null )box.Items.Clear();box
14、.Items.AddRange(m_ForChoice.ToArray();用戶在輸入時(shí),經(jīng)常喜歡加空格,如兩個(gè)字的姓名“張三”,用戶喜歡輸成“張 三”,雖然可以和三個(gè)字的姓名對(duì)齊,比較美觀,但對(duì)程序中姓名檢索等非常不便,因?yàn)槟氵€要判斷中間是否有空格,有多少空格等,為此,我們?cè)O(shè)置一個(gè)“性質(zhì)”來(lái)決定是否允許用戶輸入空格。private bool m_AllowSpace=false;public bool AllowSpacegetreturn m_AllowSpace;setm_AllowSpace=value;在輸入過(guò)程中,有些內(nèi)容是只能選擇不能輸入的,就象我們將ComboBox的DropD
15、ownStyle設(shè)置為DropDownList一樣,但為了方便用戶,我們?cè)试S用戶輸入,光標(biāo)離開(kāi)本文本框時(shí),進(jìn)行檢查,判斷用戶輸入的內(nèi)容是否在可選項(xiàng)內(nèi),如果不在,則清空用戶輸入,因此,添加下面變量:private bool m_bChoiceOnly=false;public bool ChoicOnlygetreturn this.m_bChoiceOnly;setthis.m_bChoiceOnly=value;按常理,我們應(yīng)該在響應(yīng)文本框的TextChange事件中根據(jù)文本變化來(lái)決定是否顯示列表框,以及列表框中該出現(xiàn)哪些可選項(xiàng),但同ComboBox一樣,文本改變事件可能有多種事件連帶引發(fā)(
16、如程序使用了TextBox1.Text=”abc”之類(lèi)),難以控制,我們這里響應(yīng)KeyUp事件,在通過(guò)KeyUp和KeyDown的配合來(lái)完成,就避開(kāi)了上述問(wèn)題。本文開(kāi)始處我們說(shuō)過(guò),可以通過(guò)鍵盤(pán)上的“”和“”在可選項(xiàng)中遍歷,而文本框默認(rèn)上下箭頭也用來(lái)移動(dòng)當(dāng)前鍵盤(pán)光標(biāo),因此,我們?cè)贙eyDown中記下當(dāng)前光標(biāo)位置,在KeyUp中恢復(fù),故聲明一個(gè)變量m_nOldPos來(lái)記錄按鍵前鍵盤(pán)光標(biāo)位置,在實(shí)際工作中我們發(fā)現(xiàn),部分輸入法存在BUG,用戶鍵入一個(gè)鍵后,產(chǎn)生了一個(gè)KeyDown后產(chǎn)生兩個(gè)KeyUp事件,為此,通過(guò)一個(gè)變量bKeyDown來(lái)記錄鍵是否按下,供KeyUp正確判斷,文本改變發(fā)生在KeyDo
17、wn和KeyUp之間,因此,在KeyDown中必須記錄當(dāng)前文本,在KeyUp中判斷文本是否改變,根據(jù)上述分析,我們添加文本框的KeyDown事件響應(yīng)代碼:private int m_nOldPos=0;private bool bKeyDown=false;private string m_strOldText=""private void TextBoxExt_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)m_nOldPos=this.SelectionStart;bKeyDown=true;m_st
18、rOldText=this.Text;創(chuàng)建一個(gè)函數(shù),用來(lái)根據(jù)文本框當(dāng)前內(nèi)容,從可供選擇的m_ForChoice數(shù)組中篩選出模糊匹配的選項(xiàng),添加到列表框中:private void FillPrompt(string p_strText)ListBox box=this.lstPrompt;if(box!=null)box.Items.Clear();if(p_strText.Length=0)/沒(méi)有內(nèi)容,顯示全部box.Items.AddRange(this.m_ForChoice.ToArray();elseforeach(string s in this.m_ForChoice)if(s.
19、IndexOf(p_strText)>=0)box.Items.Add(s);添加文本框的KeyUp事件響應(yīng)代碼:private void TextBoxExt_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)if(!bKeyDown)/忽略掉多余的KeyUp事件return;bKeyDown=false;ListBox box=this.lstPrompt;switch(e.KeyCode)/通過(guò)上下箭頭在待選框中移動(dòng)case System.Windows.Forms.Keys.Up:case System.Window
20、s.Forms.Keys.Down:if(box!=null) && !this.Multiline)/多行文本通過(guò)上下箭頭在兩行之間移動(dòng)if(e.KeyCode=System.Windows.Forms.Keys.Up) && (box.SelectedIndex>-1)/box.SelectedIndex-;else if(e.KeyCode=System.Windows.Forms.Keys.Down) && (box.SelectedIndex<box.Items.Count-1)/box.SelectedIndex+;/上下
21、箭頭不能移動(dòng)當(dāng)前光標(biāo),因此,還原原來(lái)位置this.SelectionStart=m_nOldPos;/顯示提示框if(!box.Visible)box.Visible=true;break;case System.Windows.Forms.Keys.Escape:/ESC隱藏提示if(box!=null) && box.Visible)box.Hide();break;case System.Windows.Forms.Keys.Return:/回車(chē)選擇或跳到下一控件if(box=null) | this.Multiline)break;/沒(méi)有顯示提示框時(shí),移動(dòng)到下一控件if
22、( !box.Visible)SendKeys.Send("TAB");else /有提示,關(guān)閉提示if(box.SelectedIndex>-1)/有選擇,使用當(dāng)前選擇的內(nèi)容this.Text=box.SelectedItem.ToString();this.SelectionStart=this.Text.Length;this.SelectAll();box.Hide();break;default:/判斷文本是否改變string strText=this.Text;/不允許產(chǎn)生空格,去掉文本中的空格if(!m_AllowSpace)strText=this.T
23、ext.Replace(" ","");int nStart=this.SelectionStart;if(strText!=m_strOldText)/文本有改變/設(shè)置當(dāng)前文本和鍵盤(pán)光標(biāo)位置this.Text=strText;if(nStart>this.Text.Length)nStart=this.Text.Length;this.SelectionStart=nStart;/修改可供選擇的內(nèi)容,并顯示供選擇的列表框if(box!=null)this.FillPrompt(strText);box.Visible=true;break;當(dāng)文本
24、框失去鍵盤(pán)光標(biāo)后,必須隱藏提示,對(duì)于只選型文本框,還要判斷用戶輸入是否在可選項(xiàng)中:private void TextBoxExt_Leave(object sender, System.EventArgs e)/對(duì)于只選字段,必須輸入同待選相匹配的值if(this.m_bChoiceOnly)int nIndex=this.ChoiceArray.IndexOf(this.Text);if(nIndex<0)this.Text=""/失去焦點(diǎn)后,必須隱藏提示ListBox box=this.lstPrompt;if(box!=null)box.Visible=false;在IE地址欄中,右邊有一個(gè)“”,我們可以點(diǎn)該箭頭來(lái)打開(kāi)提示框,本例中沒(méi)有增加該功能不能不說(shuō)是一個(gè)缺陷,這里,我們用雙擊文本框的辦法來(lái)代替:private void TextBoxExt_DoubleClick(object sender, System.EventArgs e)ListBox box=this.lstPrompt;if(box!=null) && (!box.Visible)box.Visible=true;切換到Test項(xiàng)目Form1的代碼窗口中,在
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度餐飲業(yè)SaaS運(yùn)營(yíng)管理軟件銷(xiāo)售合同3篇
- 2024版物流倉(cāng)儲(chǔ)中心租賃及運(yùn)營(yíng)管理合同
- 2025年度銷(xiāo)售合同違約責(zé)任補(bǔ)充協(xié)議
- 年度回轉(zhuǎn)窯式垃圾焚燒爐市場(chǎng)分析及競(jìng)爭(zhēng)策略分析報(bào)告
- 二零二五版城市更新項(xiàng)目借款合同規(guī)范2篇
- 2024-2025學(xué)年高中歷史專(zhuān)題七近代以來(lái)科學(xué)技術(shù)的輝煌7.2追尋生命的起源同步課時(shí)作業(yè)含解析人民版必修3
- 二零二四年倉(cāng)儲(chǔ)物流園建設(shè)項(xiàng)目融資合同
- 二零二五年度酒店客房安全監(jiān)控服務(wù)合同3篇
- 2025年度林業(yè)生態(tài)補(bǔ)償項(xiàng)目評(píng)估合同4篇
- 2025版茅臺(tái)酒經(jīng)銷(xiāo)商培訓(xùn)及銷(xiāo)售技能提升合同3篇
- GB/T 7588.2-2020電梯制造與安裝安全規(guī)范第2部分:電梯部件的設(shè)計(jì)原則、計(jì)算和檢驗(yàn)
- GB/T 14600-2009電子工業(yè)用氣體氧化亞氮
- 小學(xué)道德與法治學(xué)科高級(jí)(一級(jí))教師職稱(chēng)考試試題(有答案)
- 申請(qǐng)使用物業(yè)專(zhuān)項(xiàng)維修資金征求業(yè)主意見(jiàn)表
- 河北省承德市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會(huì)明細(xì)
- 實(shí)用性閱讀與交流任務(wù)群設(shè)計(jì)思路與教學(xué)建議
- 應(yīng)急柜檢查表
- 通風(fēng)設(shè)施標(biāo)準(zhǔn)
- 酒店市場(chǎng)營(yíng)銷(xiāo)教案
- 房屋買(mǎi)賣(mài)合同簡(jiǎn)單范本 房屋買(mǎi)賣(mài)合同簡(jiǎn)易范本
- 環(huán)保有限公司營(yíng)銷(xiāo)策劃方案
評(píng)論
0/150
提交評(píng)論