国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#自定義DataGridViewColumn顯示TreeView

2019-10-29 21:34:22
字體:
供稿:網(wǎng)友
我們可以自定義DataGridView的DataGridViewColumn來實現(xiàn)自定義的列,下面介紹一下如何通過擴(kuò)展DataGridViewColumn來實現(xiàn)一個TreeViewColumn
 

我們可以自定義DataGridView的DataGridViewColumn來實現(xiàn)自定義的列,下面介紹一下如何通過擴(kuò)展DataGridViewColumn來實現(xiàn)一個TreeViewColumn

1.TreeViewColumn類

 TreeViewColumn繼承自DataGridViewColumn,為了動態(tài)給TreeViewColumn傳入一個TreeView,這里暴露出一個公共屬性_root,可以綁定一個初始化的TreeView. 另外需要重寫DataGridCell類型的CellTemplate,這里返還一個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,這里就是具體實現(xiàn)其邏輯。一般來說選擇樹控件的節(jié)點后,返回的是一個文本信息,是文本類型,可以繼承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時,顯示的為樹編輯控件,需要繼承TreeView,同時實現(xiàn)IDataGridViewEditingControl接口,實現(xiàn)以下方法:

C#自定義DataGridViewColumn顯示TreeView

 public class TreeViewEditingControl : TreeView, IDataGridViewEditingControl  {   DataGridView dataGridView;   private bool valueChanged = false;   int rowIndex;   public TreeViewEditingControl()   {    try    {     //必須加Roots.tree.Nodes[].Clone() 否則報錯 不能在多處增添或插入項,必須首先將其從當(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ù),定義一個全局靜態(tài)類:

 /// <summary>  /// 靜態(tài)類的靜態(tài)屬性,用于在不同class間傳遞參數(shù)  /// </summary>  public static class Roots  {   //從前臺綁定樹  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  {   //從前臺綁定樹   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() 否則報錯 不能在多處增添或插入項,必須首先將其從當(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);   }  } }

C#自定義DataGridViewColumn顯示TreeView

  當(dāng)編輯無誤后,可以在添加列的時候看到TreeViewColumn類型。此類型暴露出一個_root屬性,可以綁定外部的一個帶數(shù)據(jù)的TreeView。

C#自定義DataGridViewColumn顯示TreeView

  運行代碼,單擊單元格,進(jìn)入編輯狀態(tài),可以看到如下界面:

C#自定義DataGridViewColumn顯示TreeView

以上內(nèi)容是小編給大家介紹的C#自定義DataGridViewColumn顯示TreeView 的全部敘述,希望大家喜歡。



注:相關(guān)教程知識閱讀請移步到c#教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 广平县| 塔城市| 德钦县| 娱乐| 天津市| 喜德县| 六安市| 哈尔滨市| 桦南县| 宝兴县| 定兴县| 武强县| 竹溪县| 祁连县| 济宁市| 金湖县| 奉贤区| 沭阳县| 怀远县| 鄂州市| 盖州市| 涞源县| 宁化县| 布尔津县| 甘孜县| 诸暨市| 松潘县| 西宁市| 临清市| 黑山县| 河池市| 铁岭市| 泰安市| 手机| 永安市| 青岛市| 同仁县| 汪清县| 井冈山市| 克拉玛依市| 宜兰市|