C#自定义DataGridViewColumn显示TreeView

2019-12-30 11:23:38于海丽

3.TreeViewEditingControl类

  TreeViewEditingControl为编辑控件,当用户编辑TreeViewCell时,显示的为树编辑控件,需要继承TreeView,同时实现IDataGridViewEditingControl接口,实现以下方法:

C#自定义DataGridViewColumn显示TreeView


 public class TreeViewEditingControl : TreeView, IDataGridViewEditingControl
  {
   DataGridView dataGridView;
   private bool valueChanged = false;
   int rowIndex;
   public TreeViewEditingControl()
   {
    try
    {
     //必须加Roots.tree.Nodes[].Clone() 否则报错 不能在多处增添或插入项,必须首先将其从当前位置移除或将其克隆
     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);
   }
  }