日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

玩转控件:对Dev中GridControl控件的封装和扩展

發布時間:2023/12/4 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 玩转控件:对Dev中GridControl控件的封装和扩展 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

清明節

清明時節雨紛紛

路上行人欲斷魂

借問酒家何處有

牧童遙指杏花村

????????又是一年清明節至,細雨綿綿猶如淚光,樹葉隨風擺動....

????????轉眼間,一年又過去了三分之一,疫情的嚴峻讓不少企業就跟清明時節的樹葉一樣,搖搖欲墜。裁員的裁員,降薪的降薪,996的996~~說起來都是淚,以上種種竟然在本公司都能見到,然而你現在還能看到博主翹著二郎腿,在工位上信誓旦旦的敲著代碼也是奇跡!哎,生活不易,且行且珍惜吧!

????????Talk is Cheap, Show me the code!

????如上所說,雖環境如此嚴峻,但也不能生疏了咱吃飯的手藝。不禁讓我感受到,對技術的追求,不僅僅靠的是興趣,更重要的是堅持啊!

????????廢話少說,前面幾個環節,博主分享了對基礎控件的封裝和擴展(舉了幾個栗子,大家可以舉一反三。或者公眾號Call我,源碼免費奉上。),后面和大家一起看看對容器控件的封裝和擴展,本篇以常用的Dev中GridControl控件的封裝和擴展。

????? ? 對容器控件的封裝和擴展,和其他控件一樣。首先,新建一個自定義類,讓其繼承Dev的GridControl:

???????????

public class KzxGridControl : GridControl, IControl

????????其次,給需要擴展的屬性用特性方式標識,便于在VS設計界面來控制。本篇以最常用的兩個功能來進行解析——GridControl右鍵菜單之復制行和導出Excel.具體核心代碼如下:

????????

private bool _displayRightClickCopyMenu = true; private bool _displayRightClickExportExcel = true; ///?<summary> /// 是否顯示右鍵菜單的復制行 /// </summary> [Category("右鍵菜單"), Description("DisplayRightClickMenu,顯示右鍵菜單的復制行按鈕"), Browsable(true)] public bool DisplayRightClickMenu {get { return _displayRightClickCopyMenu; }set { _displayRightClickCopyMenu = value; } } /// <summary> /// 是否顯示右鍵菜單的導出Excel /// </summary> [Category("右鍵菜單"), Description("DisplayRightExportExcel,顯示右鍵菜單的導出Excel按鈕"), Browsable(true)] public bool DisplayRightExportExcel {get { return _displayRightClickExportExcel; }set { _displayRightClickExportExcel = value; } }

????????編譯后,返回設計界面,點擊GridControl控件查看屬性窗體會發現我們剛剛新增的擴展屬性:

????

????????屬性設置完畢后,接下來就是初始化綁定該菜單的功能事件。

????????????

/// <summary> /// 構造 /// </summary> public KzxGridControl(): base() {if (this.MainView == null){this.gridView1 = new DevExpress.XtraGrid.Views.Grid.GridView();((System.ComponentModel.ISupportInitialize)(this.gridView1)).BeginInit();((System.ComponentModel.ISupportInitialize)(this)).BeginInit();this.SuspendLayout();this.gridView1.GridControl = this;this.gridView1.Name = "gridView1";this.gridView1.VertScrollVisibility = ScrollVisibility.Always;this.gridView1.HorzScrollVisibility = ScrollVisibility.Always;this.MainView = this.gridView1;this.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] {this.gridView1});((System.ComponentModel.ISupportInitialize)(this.gridView1)).EndInit();((System.ComponentModel.ISupportInitialize)(this)).EndInit();this.ResumeLayout(false);}this._KzxBandedGridView = new KzxBandedGridView(false, _bandedGridView, this);this.Load += new EventHandler(GridControl_Load); }

????????在構造函數中,綁定load事件,用于觸發菜單事件

????????private?void?GridControl_Load(object?sender,?EventArgs?e) { ToolStripItem item3;ToolStripItem item4;if (this.ContextMenuStrip == null){this.ContextMenuStrip = new ContextMenuStrip();}this._ContextMenuStrip = this.ContextMenuStrip;_ContextMenuStrip.Opened += _ContextMenuStrip_Opened;//如果需要顯示右鍵復制行if (_displayRightClickCopyMenu){item3 = this._ContextMenuStrip.Items.Add(GetLanguage("RMI000452", "復制行"));//復制行item3.Name = "copyline";item3.Click += new EventHandler(CopyLine);}//如果需要顯示右鍵導出Excelif (_displayRightClickExportExcel){item4 = this._ContextMenuStrip.Items.Add(GetLanguage("SYS001196", "導出EXCEL"));//導出EXCELitem4.Click += new EventHandler((s, ee) =>{ //TODO:導出Excel動作});}...

????????導出方法比比皆是,因項目而異,多表頭的,普通的。。就不獻丑了(如有需要也可公眾號call我,源碼免費奉上)。此處我們拿復制行來舉栗子,方法如下:

#region 復制行 public void CopyLine(object sender, EventArgs e){StringBuilder sqlsb = new StringBuilder();GridView gridview = this.MainView as GridView;DataTable dt = null;DataColumn[] columns = null;//BindingSource bs = null;DataRow row = null;DataRow rowtemp = null;//舉例是拿DataTable做數據源,所以下面代碼暫時屏蔽//bs = (this.DataSource as BindingSource);if (this.DataSource != null){if (gridview.FocusedRowHandle >= 0){row = gridview.GetDataRow(gridview.FocusedRowHandle);dt = ((this.DataSource as DataTable).DefaultView as DataView).Table;if (dt.PrimaryKey != null){columns = dt.PrimaryKey;}DataTable dttemp = dt.Clone();rowtemp = dttemp.Rows.Add(row.ItemArray);foreach (DataColumn c in columns){rowtemp[c.ColumnName] = Guid.NewGuid();}//判斷iOrder是否存在,存在則不復制,且取最大值+1if (dt.Columns.Contains("iOrder")){int maxIOrder = string.IsNullOrWhiteSpace(dt.Compute("max(iOrder)", "1=1").ToString()) ? 0 : Convert.ToInt32(dt.Compute("max(iOrder)", "1=1").ToString());rowtemp["iOrder"] = maxIOrder + 1;}dt.ImportRow(rowtemp);//執行右鍵復制行委托OnRowCopy?.Invoke();}}else{KzxMessageBox.Show(sysClass.ssLoadMsgOrDefault("MSG002204", "數據源不能為空"));}}#endregion private void CopyLineMenu(){//是否顯示右鍵的復制行按鈕if (this._displayRightClickCopyMenu == true){bool iscontain = false;ToolStripItem item3;if (this.ContextMenuStrip == null){this.ContextMenuStrip = new ContextMenuStrip();}this._ContextMenuStrip = this.ContextMenuStrip;for (int i = 0; i < this._ContextMenuStrip.Items.Count; i++){if (this._ContextMenuStrip.Items[i].Name.Equals("copyline", StringComparison.OrdinalIgnoreCase) == true){iscontain = true;break;}}if (iscontain == false){item3 = this._ContextMenuStrip.Items.Add(GetLanguage("RMI000452", "復制行"));//復制行item3.Name = "copyline";item3.Click += new EventHandler(CopyLine);}}}

?????????具體效果如下:

(右鍵菜單效果)

(如圖:多次復制行,新增多條數據)

????????完成!不過注意,以上功能如果運用于實際項目,煩請做好控制,尤其復制行功能,初衷是一個很復雜的GridControl十幾二十多列的,不想一列一列輸入的,可以采用這種模式,復制行后改動下即可。注意最好是在編輯狀態下顯示此操作,否則不僅不會保存到數據庫,還白費功夫!此文只是演示效果而已!本篇到此結束...

????????最后,由于后續所有重寫/重繪控件都在同一個項目使用,而且Dev系統引用文件較多,壓縮后源碼文件仍然很大,如果有需要源碼的朋友,可以微信公眾號聯系博主,源碼可以免費贈予~!有疑問的也可以CALL我一起探討。

????????最最后,感謝您的耐心陪伴!如果覺得本篇博文對您或者身邊朋友有幫助的,麻煩點個關注!贈人玫瑰,手留余香,您的支持就是我寫作最大的動力,感謝您的關注,期待和您一起探討!再會!

總結

以上是生活随笔為你收集整理的玩转控件:对Dev中GridControl控件的封装和扩展的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。