C#自定義DataGridViewColumn顯示TreeView
我們可以自定義DataGridView的DataGridViewColumn來實(shí)現(xiàn)自定義的列,下面介紹一下如何通過擴(kuò)展DataGridViewColumn來實(shí)現(xiàn)一個(gè)TreeViewColumn
1.TreeViewColumn類
TreeViewColumn繼承自DataGridViewColumn,為了動(dòng)態(tài)給TreeViewColumn傳入一個(gè)TreeView,這里暴露出一個(gè)公共屬性_root,可以綁定一個(gè)初始化的TreeView. 另外需要重寫DataGridCell類型的CellTemplate,這里返還一個(gè)TreeViewCell(需要自定義)
/// <summary> /// Host TreeView In DataGridView Cell /// </summary> public class TreeViewColumn : DataGridViewColumn { public TreeViewColumn() : base(new TreeViewCell()) { } [Description("Set TreeView Root in DataGridView Cell"), Category("TreeView")] public TreeView _root { get{return Roots.tree;} set{Roots.tree=value;} } public override DataGridViewCell CellTemplate { get { return base.CellTemplate; } set { // Ensure that the cell used for the template is a TreeViewCell. if (value != null && !value.GetType().IsAssignableFrom(typeof(TreeViewCell))) { throw new InvalidCastException("Must be a TreeViewCell"); } base.CellTemplate = value; } } }
2.TreeViewCell類
上面TreeViewColumn重寫了CellTemplate,返回的就是自定義的TreeViewCell,這里就是具體實(shí)現(xiàn)其邏輯。一般來說選擇樹控件的節(jié)點(diǎn)后,返回的是一個(gè)文本信息,是文本類型,可以繼承DataGridViewTextBoxCell,并重寫InitializeEditingControl來進(jìn)行自定義的DataGridView.EditingControl (編輯控件)。
public class TreeViewCell : DataGridViewTextBoxCell { public TreeViewCell() : base() { //初始設(shè)置 } public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) { // Set the value of the editing control to the current cell value. base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle); TreeViewEditingControl ctl = DataGridView.EditingControl as TreeViewEditingControl; // Use the default row value when Value property is null. if (this.Value == null) { ctl.SelectedNode =new TreeNode( this.DefaultNewRowValue.ToString()); } else { ctl.SelectedNode = new TreeNode(this.Value.ToString()); } } public override Type EditType { get { // Return the type of the editing control that CalendarCell uses. return typeof(TreeViewEditingControl); } } public override Type ValueType { get { // Return the type of the value that CalendarCell contains. return typeof(String); } } public override object DefaultNewRowValue { get { // Use the current date and time as the default value. return ""; } } }
3.TreeViewEditingControl類
TreeViewEditingControl為編輯控件,當(dāng)用戶編輯TreeViewCell時(shí),顯示的為樹編輯控件,需要繼承TreeView,同時(shí)實(shí)現(xiàn)IDataGridViewEditingControl接口,實(shí)現(xiàn)以下方法:
public class TreeViewEditingControl : TreeView, IDataGridViewEditingControl { DataGridView dataGridView; private bool valueChanged = false; int rowIndex; public TreeViewEditingControl() { try { //必須加Roots.tree.Nodes[].Clone() 否則報(bào)錯(cuò) 不能在多處增添或插入項(xiàng),必須首先將其從當(dāng)前位置移除或?qū)⑵淇寺? this.Nodes.Add(Roots.tree.Nodes[].Clone() as TreeNode); this.SelectedNode = this.Nodes[]; } catch (Exception ex) { MessageBox.Show(ex.Message); } } // Implements the IDataGridViewEditingControl.EditingControlFormattedValue // property. public object EditingControlFormattedValue { get { return this.SelectedNode.Text; } set { if (value is String) { try { // This will throw an exception of the string is // null, empty, or not in the format of a date. this.SelectedNode = new TreeNode((String)value); } catch { // In the case of an exception, just use the // default value so we're not left with a null // value. this.SelectedNode = new TreeNode(""); } } } } // Implements the // IDataGridViewEditingControl.GetEditingControlFormattedValue method. public object GetEditingControlFormattedValue( DataGridViewDataErrorContexts context) { return EditingControlFormattedValue; } // Implements the // IDataGridViewEditingControl.ApplyCellStyleToEditingControl method. public void ApplyCellStyleToEditingControl( DataGridViewCellStyle dataGridViewCellStyle) { this.Font = dataGridViewCellStyle.Font; this.ForeColor = dataGridViewCellStyle.ForeColor; this.BackColor = dataGridViewCellStyle.BackColor; } // Implements the IDataGridViewEditingControl.EditingControlRowIndex // property. public int EditingControlRowIndex { get { return rowIndex; } set { rowIndex = value; } } // Implements the IDataGridViewEditingControl.EditingControlWantsInputKey // method. public bool EditingControlWantsInputKey( Keys key, bool dataGridViewWantsInputKey) { // Let the TreeViewPicker handle the keys listed. switch (key & Keys.KeyCode) { case Keys.Left: case Keys.Up: case Keys.Down: case Keys.Right: case Keys.Home: case Keys.End: case Keys.PageDown: case Keys.PageUp: return true; default: return !dataGridViewWantsInputKey; } } // Implements the IDataGridViewEditingControl.PrepareEditingControlForEdit // method. public void PrepareEditingControlForEdit(bool selectAll) { // No preparation needs to be done. } // Implements the IDataGridViewEditingControl // .RepositionEditingControlOnValueChange property. public bool RepositionEditingControlOnValueChange { get { return false; } } // Implements the IDataGridViewEditingControl // .EditingControlDataGridView property. public DataGridView EditingControlDataGridView { get { return dataGridView; } set { dataGridView = value; } } // Implements the IDataGridViewEditingControl // .EditingControlValueChanged property. public bool EditingControlValueChanged { get { return valueChanged; } set { valueChanged = value; } } // Implements the IDataGridViewEditingControl // .EditingPanelCursor property. public Cursor EditingPanelCursor { get { return base.Cursor; } } protected override void OnAfterExpand(TreeViewEventArgs e) { base.OnAfterExpand(e); this.dataGridView.Columns[this.dataGridView.CurrentCell.ColumnIndex].Width = this.Width+; this.dataGridView.Rows[this.dataGridView.CurrentCell.RowIndex].Height = this.Height+; } protected override void OnAfterSelect(TreeViewEventArgs e) { // Notify the DataGridView that the contents of the cell // have changed. valueChanged = true; this.EditingControlDataGridView.NotifyCurrentCellDirty(true); base.OnAfterSelect(e); } }
為了在不同類之間傳遞參數(shù),定義一個(gè)全局靜態(tài)類:
/// <summary> /// 靜態(tài)類的靜態(tài)屬性,用于在不同class間傳遞參數(shù) /// </summary> public static class Roots { //從前臺(tái)綁定樹 public static TreeView tree = null; }
完整代碼為:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.ComponentModel; namespace Host_Controls_in_Windows_Forms_DataGridView_Cells { /// <summary> /// 靜態(tài)類的靜態(tài)屬性,用于在不同class間傳遞參數(shù) /// </summary> public static class Roots { //從前臺(tái)綁定樹 public static TreeView tree = null; } /// <summary> /// Host TreeView In DataGridView Cell /// </summary> public class TreeViewColumn : DataGridViewColumn { public TreeViewColumn() : base(new TreeViewCell()) { } [Description("Set TreeView Root in DataGridView Cell"), Category("TreeView")] public TreeView _root { get{return Roots.tree;} set{Roots.tree=value;} } public override DataGridViewCell CellTemplate { get { return base.CellTemplate; } set { // Ensure that the cell used for the template is a TreeViewCell. if (value != null && !value.GetType().IsAssignableFrom(typeof(TreeViewCell))) { throw new InvalidCastException("Must be a TreeViewCell"); } base.CellTemplate = value; } } } //---------------------------------------------------------------------- public class TreeViewCell : DataGridViewTextBoxCell { public TreeViewCell() : base() { //初始設(shè)置 } public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) { // Set the value of the editing control to the current cell value. base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle); TreeViewEditingControl ctl = DataGridView.EditingControl as TreeViewEditingControl; // Use the default row value when Value property is null. if (this.Value == null) { ctl.SelectedNode =new TreeNode( this.DefaultNewRowValue.ToString()); } else { ctl.SelectedNode = new TreeNode(this.Value.ToString()); } } public override Type EditType { get { // Return the type of the editing control that CalendarCell uses. return typeof(TreeViewEditingControl); } } public override Type ValueType { get { // Return the type of the value that CalendarCell contains. return typeof(String); } } public override object DefaultNewRowValue { get { // Use the current date and time as the default value. return ""; } } } //----------------------------------------------------------------- public class TreeViewEditingControl : TreeView, IDataGridViewEditingControl { DataGridView dataGridView; private bool valueChanged = false; int rowIndex; public TreeViewEditingControl() { try { //必須加Roots.tree.Nodes[].Clone() 否則報(bào)錯(cuò) 不能在多處增添或插入項(xiàng),必須首先將其從當(dāng)前位置移除或?qū)⑵淇寺? this.Nodes.Add(Roots.tree.Nodes[].Clone() as TreeNode); this.SelectedNode = this.Nodes[]; } catch (Exception ex) { MessageBox.Show(ex.Message); } } // Implements the IDataGridViewEditingControl.EditingControlFormattedValue // property. public object EditingControlFormattedValue { get { return this.SelectedNode.Text; } set { if (value is String) { try { // This will throw an exception of the string is // null, empty, or not in the format of a date. this.SelectedNode = new TreeNode((String)value); } catch { // In the case of an exception, just use the // default value so we're not left with a null // value. this.SelectedNode = new TreeNode(""); } } } } // Implements the // IDataGridViewEditingControl.GetEditingControlFormattedValue method. public object GetEditingControlFormattedValue( DataGridViewDataErrorContexts context) { return EditingControlFormattedValue; } // Implements the // IDataGridViewEditingControl.ApplyCellStyleToEditingControl method. public void ApplyCellStyleToEditingControl( DataGridViewCellStyle dataGridViewCellStyle) { this.Font = dataGridViewCellStyle.Font; this.ForeColor = dataGridViewCellStyle.ForeColor; this.BackColor = dataGridViewCellStyle.BackColor; } // Implements the IDataGridViewEditingControl.EditingControlRowIndex // property. public int EditingControlRowIndex { get { return rowIndex; } set { rowIndex = value; } } // Implements the IDataGridViewEditingControl.EditingControlWantsInputKey // method. public bool EditingControlWantsInputKey( Keys key, bool dataGridViewWantsInputKey) { // Let the TreeViewPicker handle the keys listed. switch (key & Keys.KeyCode) { case Keys.Left: case Keys.Up: case Keys.Down: case Keys.Right: case Keys.Home: case Keys.End: case Keys.PageDown: case Keys.PageUp: return true; default: return !dataGridViewWantsInputKey; } } // Implements the IDataGridViewEditingControl.PrepareEditingControlForEdit // method. public void PrepareEditingControlForEdit(bool selectAll) { // No preparation needs to be done. } // Implements the IDataGridViewEditingControl // .RepositionEditingControlOnValueChange property. public bool RepositionEditingControlOnValueChange { get { return false; } } // Implements the IDataGridViewEditingControl // .EditingControlDataGridView property. public DataGridView EditingControlDataGridView { get { return dataGridView; } set { dataGridView = value; } } // Implements the IDataGridViewEditingControl // .EditingControlValueChanged property. public bool EditingControlValueChanged { get { return valueChanged; } set { valueChanged = value; } } // Implements the IDataGridViewEditingControl // .EditingPanelCursor property. public Cursor EditingPanelCursor { get { return base.Cursor; } } protected override void OnAfterExpand(TreeViewEventArgs e) { base.OnAfterExpand(e); this.dataGridView.Columns[this.dataGridView.CurrentCell.ColumnIndex].Width = this.Width+; this.dataGridView.Rows[this.dataGridView.CurrentCell.RowIndex].Height = this.Height+; } protected override void OnAfterSelect(TreeViewEventArgs e) { // Notify the DataGridView that the contents of the cell // have changed. valueChanged = true; this.EditingControlDataGridView.NotifyCurrentCellDirty(true); base.OnAfterSelect(e); } } }
當(dāng)編輯無誤后,可以在添加列的時(shí)候看到TreeViewColumn類型。此類型暴露出一個(gè)_root屬性,可以綁定外部的一個(gè)帶數(shù)據(jù)的TreeView。
運(yùn)行代碼,單擊單元格,進(jìn)入編輯狀態(tài),可以看到如下界面:
以上內(nèi)容是小編給大家介紹的C#自定義DataGridViewColumn顯示TreeView 的全部敘述,希望大家喜歡。
欄 目:C#教程
下一篇:C#編程實(shí)現(xiàn)簡(jiǎn)易圖片瀏覽器的方法
本文標(biāo)題:C#自定義DataGridViewColumn顯示TreeView
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6789.html
您可能感興趣的文章
- 01-10C#自定義簽名章實(shí)現(xiàn)方法
- 01-10WinForm實(shí)現(xiàn)自定義右下角提示效果的方法
- 01-10C#實(shí)現(xiàn)自定義windows系統(tǒng)日志的方法
- 01-10C#自定義事件監(jiān)聽實(shí)現(xiàn)方法
- 01-10C#編程實(shí)現(xiàn)自定義熱鍵的方法
- 01-10C#實(shí)現(xiàn)打開畫圖的同時(shí)載入圖片、最大化顯示畫圖窗體的方法
- 01-10C#實(shí)現(xiàn)將窗體固定在顯示器的左上角且不能移動(dòng)的方法
- 01-10C#獲取任務(wù)欄顯示進(jìn)程的方法
- 01-10C#實(shí)現(xiàn)ComboBox控件顯示出多個(gè)數(shù)據(jù)源屬性的方法
- 01-10C#實(shí)現(xiàn)讀取DataSet數(shù)據(jù)并顯示在ListView控件中的方法


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文