在Excel催化劑的幾大輔助錄入功能中(數據驗證保護、數據多級聯動輸入、關鍵詞模糊智能匹配輸入)中,用了一些customxmlPart技術來存儲配置信息,同時在關鍵詞模糊智能匹配輸入中,用了一個VSTO開發才能知足的自定義控件技術,很值得啓發,拿出來給你們做一分享。java
通常來講控件都是放到窗體或任務窗格中,但Excel一樣支持將控件放到工做表單元格上,如前面提到的picturebox容器,放到單元格區域上,而後在容器上發圖片,實現插入圖片功能,一樣地也能夠存放單選、複選這些控件,固然,嚴格來講,在VBA環境下也能夠完成這些工做。數據庫
在VSTO框架下,有一革命性的突破是,能夠放咱們的自定義控件,這個具體和VBA的自定義Active控件有什麼不同,就不太知道,但起碼VSTO放自定義控件,開發成本極低。服務器
經過用戶配置操做,將須要進行快速錄入的區域記錄下來,用SelectionChange事件來響應,若用戶選擇到這些單元格時,就激發事件方法,顯示自定義控件,並讓光標定位到自定義控件的查找控件TextBox等待用戶輸入。輸入過程當中動態控制下方DataGridView的查找結果,用戶能夠按方向箭下上在結果中選擇對應的條目,再按Enter或Tab鍵肯定內容錄入。微信
先綁定事件框架
internal void ExcelApp_SheetSelectionChangeFastInput(object Sh, Excel.Range Target) { try { Globals.ThisAddIn.Application.SheetSelectionChange -= this.ExcelApp_SheetSelectionChangeFastInput; FormFastInput.UscFastInput.UserControlTextBox.KeyDown -= FormFastInput.UscFastInput.textBox1_KeyDown; if (Target.Cells.CountLarge == 1) { FormFastInput.SelectionChangeOfFastInput(Target); } } catch (Exception ex) { Common.OutMsgError(ex); } finally { Globals.ThisAddIn.Application.SheetSelectionChange += this.ExcelApp_SheetSelectionChangeFastInput; FormFastInput.UscFastInput.UserControlTextBox.KeyDown += FormFastInput.UscFastInput.textBox1_KeyDown; } }
響應錄入單元格區域的代碼,將自定義控件顯示尺寸變大,以前有個關鍵點是隱藏了自定義控件後再顯示,焦點不能順利落到自定義控件的搜索TextBox上,採用了迂迴的隱藏時不是真隱藏,只是縮小成1*1像素大小,好像後來其餘位置發現了更好解決方案,原代碼沒有來得及從新改過來。ide
public static void SelectionChangeOfFastInput(Excel.Range Target) { FormFastInput.CurrentSelectCell = Target; int fastInputID = GetFastInputID(Target);//找不到有交集時返回int最大值 if (fastInputID < int.MaxValue) { FormFastInput.UscFastInput.FastInputID = fastInputID;//傳入usc中,下一次textbox事件能夠直接用,不用再找。 ShowUscAndSettingUscFastInputTextBox(Target); FormFastInput.UscFastInput.IsTextChanged = false; FormFastInput.UscFastInput.DgvSelectedRowIndex = 0; FormFastInput.UscFastInput.IsFirstEnterDgv = true;//爲了可以在首次爲0時仍然是0而不是+1的效果 SettingUscLableAndFilterDgv(fastInputID); } else { //FormFastInput.InputUserControl.Visible = false; FormFastInput.InputUserControl.Width = 1; //縮小成1而不是隱藏,爲了下次激活時能夠順利進入textbox激活 FormFastInput.InputUserControl.Height = 1; } }
有個小細節,在窗體中,怎樣控制默認的Enter和Tab鍵的功能,默認爲窗體退出鍵和TabIndex跳轉鍵,這裏有個對一個方法進行重寫便可。函數
protected override bool ProcessDialogKey(Keys keyData) { if (keyData == Keys.Enter || keyData == Keys.Tab) { ReturnValueFromUserControl(keyData); return true; } return base.ProcessDialogKey(keyData); }
改變其默認功能後,就能夠像其餘鍵同樣捕捉其KeyDown事件,例如此處的錄入功能中,按Enter是跳轉到下一行,按Tab是跳轉到右側列,實現鍵盤盲打錄入不依賴鼠標實現。工具
internal void textBox1_KeyDown(object sender, KeyEventArgs e) { try { if (this.IsTextChanged) { switch (e.KeyCode) { case Keys.Down: if (this.IsFirstEnterDgv == true || this.DgvSelectedRowIndex == this.dataGridView1.Rows.Count - 1) { this.DgvSelectedRowIndex = 0; this.IsFirstEnterDgv = false; } else { this.DgvSelectedRowIndex++; } RedirectDgvRow(); break; case Keys.Up: if (this.DgvSelectedRowIndex == 0) { this.DgvSelectedRowIndex = this.dataGridView1.Rows.Count - 1; } else { this.DgvSelectedRowIndex--; } RedirectDgvRow(); break; case Keys.Tab: ReturnValueFromUserControl(Keys.Tab); break; case Keys.Enter: ReturnValueFromUserControl(Keys.Enter); break; default: break; } } else//剛剛進到文本框中,想跳出來選擇其餘單元格時 { switch (e.KeyCode) { case Keys.Down: case Keys.Enter: FormFastInput.CurrentSelectCell.Offset[1, 0].Select(); break; case Keys.Up: FormFastInput.CurrentSelectCell.Offset[-1, 0].Select(); break; case Keys.Left: FormFastInput.CurrentSelectCell.Offset[0, -1].Select(); break; case Keys.Right: case Keys.Tab: FormFastInput.CurrentSelectCell.Offset[0, 1].Select(); break; } } } catch (Exception) { } finally { } } private void ReturnValueFromUserControl(Keys keys) { bool isDgvSelected = this.dataGridView1.Rows.Cast<DataGridViewRow>().Any(s => s.Selected); //當dgv有選擇列時 if (isDgvSelected) { FormFastInput.CurrentSelectCell.Value2 = this.dataGridView1.SelectedRows[0].Cells[FormFastInput.ReturnColIndex].Value; } else { FormFastInput.CurrentSelectCell.Value2 = this.textBox1.Text; } if (keys == Keys.Tab) { FormFastInput.CurrentSelectCell.Offset[0, 1].Select(); } else if (keys == Keys.Enter) { FormFastInput.CurrentSelectCell.Offset[1, 0].Select(); } }
在VSTO框架下,有大量微軟工程師爲咱們搭建好的底層技術,使咱們在上層構建業務代碼時變得如此輕鬆,此篇給你們展現了在工做表單元格區域上建立自定義控件的能力,發揮得當,較直接彈出窗體的效果要友好得多。學習
QQ羣名:Excel催化劑開源討論羣, QQ羣號:788145319this
Excel催化劑先是一微信公衆號的名稱,後來順其名稱,正式推出了Excel插件,插件將持續性地更新,更新的週期視本人的時間而定爭取一週可以上線一個大功能模塊。Excel催化劑插件承諾我的用戶永久性無償使用!
Excel催化劑插件使用最新的佈署技術,實現一次安裝,往後全部更新自動更新完成,無需重複關注更新動態,手動下載安裝包從新安裝,只需一次安裝便可隨時保持最新版本!
Excel催化劑插件下載連接:https://pan.baidu.com/s/1Iz2_NZJ8v7C9eqhNjdnP3Q
取名催化劑,因Excel自己的強大,並不是全部人可以立馬享受到,大部分人仍是在被Excel軟件所虐的階段,就是頭腦裏很清晰想達到的效果,並且高手們也已經實現出來,就是本身怎麼弄都弄不出來,或者更糟的是還不知道Excel可以作什麼而停留在不斷地重複、機械、手工地在作着數據,耗費着無數的青春年華歲月。因此催生了是否能夠做爲一種媒介,讓廣大的Excel用戶們能夠瞬間點燃Excel的爆點,無需苦苦地掙扎地沒日沒夜的技巧學習、高級複雜函數的燒腦,最終走向了從入門到放棄的道路。
最後Excel功能強大,其實還需樹立一個觀點,不是全部事情都要交給Excel去完成,也不是全部事情Excel都是十分勝任的,外面的世界仍然是一個廣闊的世界,Excel只是其中一枚耀眼的明星,還有其餘更多一樣精彩強大的技術、工具等。*Excel催化劑也將借力這些其餘技術,讓Excel可以發揮更強大的爆發!
姓名:李偉堅,從事數據分析工做多年(BI方向),一名一樣在路上的學習者。
服務過行業:零售特別是鞋服類的零售行業,電商(淘寶、天貓、京東、惟品會)
技術路線從一名普通用戶,經過Excel軟件的學習,今後走向數據世界,非科班IT專業人士。
歷經重重難關,終於在數據的道路上達到技術平原期,學習衆多的知識再也不太吃力,同時也造成了本身的一套數據解決方案(數據採集、數據加工清洗、數據多維建模、數據報表展現等)。
擅長技術領域:Excel等Office家族軟件、VBA&VSTO的二次開發、Sqlserver數據庫技術、Sqlserver的商業智能BI技術、Powerbi技術、雲服務器佈署技術等等。
2018年開始職業生涯做了重大調整,從原來的正職工做,轉爲自由職業者,暫無固定收入,暫對前面道路不太明朗,苦從新回到正職工做,對Excel催化劑的運營和開發一定受到很大的影響(正職工做時間內不可能維護也不可能隨便把工做時間內的成果公佈於外,工做外的時間也十分有限,因已而立之年,家庭責任重大)。
和廣大擁護者一同期盼:Excel催化劑一直能運行下去,我所惠及的羣體們可以給予支持(多留言鼓勵下、轉發下朋友圈推薦、小額打賞下和最重點的能夠和所在公司及同行推薦推薦,讓個人技術能夠在貴司發揮價值,實現共贏(初步設想能夠數據顧問的方式或一些小型項目開發的方式合做)。
QQ羣名:Excel催化劑開源討論羣, QQ羣號:788145319
Excel催化劑先是一微信公衆號的名稱,後來順其名稱,正式推出了Excel插件,插件將持續性地更新,更新的週期視本人的時間而定爭取一週可以上線一個大功能模塊。Excel催化劑插件承諾我的用戶永久性無償使用!
Excel催化劑插件使用最新的佈署技術,實現一次安裝,往後全部更新自動更新完成,無需重複關注更新動態,手動下載安裝包從新安裝,只需一次安裝便可隨時保持最新版本!
Excel催化劑插件下載連接:https://pan.baidu.com/s/1Iz2_NZJ8v7C9eqhNjdnP3Q
取名催化劑,因Excel自己的強大,並不是全部人可以立馬享受到,大部分人仍是在被Excel軟件所虐的階段,就是頭腦裏很清晰想達到的效果,並且高手們也已經實現出來,就是本身怎麼弄都弄不出來,或者更糟的是還不知道Excel可以作什麼而停留在不斷地重複、機械、手工地在作着數據,耗費着無數的青春年華歲月。因此催生了是否能夠做爲一種媒介,讓廣大的Excel用戶們能夠瞬間點燃Excel的爆點,無需苦苦地掙扎地沒日沒夜的技巧學習、高級複雜函數的燒腦,最終走向了從入門到放棄的道路。
最後Excel功能強大,其實還需樹立一個觀點,不是全部事情都要交給Excel去完成,也不是全部事情Excel都是十分勝任的,外面的世界仍然是一個廣闊的世界,Excel只是其中一枚耀眼的明星,還有其餘更多一樣精彩強大的技術、工具等。*Excel催化劑也將借力這些其餘技術,讓Excel可以發揮更強大的爆發!
姓名:李偉堅,從事數據分析工做多年(BI方向),一名一樣在路上的學習者。
服務過行業:零售特別是鞋服類的零售行業,電商(淘寶、天貓、京東、惟品會)
技術路線從一名普通用戶,經過Excel軟件的學習,今後走向數據世界,非科班IT專業人士。
歷經重重難關,終於在數據的道路上達到技術平原期,學習衆多的知識再也不太吃力,同時也造成了本身的一套數據解決方案(數據採集、數據加工清洗、數據多維建模、數據報表展現等)。
擅長技術領域:Excel等Office家族軟件、VBA&VSTO的二次開發、Sqlserver數據庫技術、Sqlserver的商業智能BI技術、Powerbi技術、雲服務器佈署技術等等。
2018年開始職業生涯做了重大調整,從原來的正職工做,轉爲自由職業者,暫無固定收入,暫對前面道路不太明朗,苦從新回到正職工做,對Excel催化劑的運營和開發一定受到很大的影響(正職工做時間內不可能維護也不可能隨便把工做時間內的成果公佈於外,工做外的時間也十分有限,因已而立之年,家庭責任重大)。
和廣大擁護者一同期盼:Excel催化劑一直能運行下去,我所惠及的羣體們可以給予支持(多留言鼓勵下、轉發下朋友圈推薦、小額打賞下和最重點的能夠和所在公司及同行推薦推薦,讓個人技術能夠在貴司發揮價值,實現共贏(初步設想能夠數據顧問的方式或一些小型項目開發的方式合做)。