using System;
using System.ComponentModel;
using System.Collections;
using System.Diagnostics;
using System.Windows.Forms;namespace DataGridEx
{
/// <summary>
/// MyTreeViewColumn 的摘要说明。
/// </summary>
public delegate void TreeViewValueChanged(int changingRow, object newValue );
public class MyTreeViewColumn : DataGridTextBoxColumn
{
public TreeView ColumnTreeView=null;
private System.Windows.Forms.CurrencyManager _source = null;
private int _rowNum;
private bool _isEditing = false;
TreeViewValueChanged _valueChanging; public MyTreeViewColumn(TreeViewValueChanged valueChanging) : base()
{
_valueChanging = valueChanging;
ColumnTreeView=new TreeView();
ColumnTreeView.LabelEdit =false;
ColumnTreeView.Leave +=new EventHandler(LeaveColumnTreeView);
ColumnTreeView.DoubleClick +=new EventHandler(ColumnTreeViewDoubleClick);
//ColumnTreeView.Select +=new EventHandler(TreeViewStartEditing);
// this.TextBox.Click +=new EventHandler(TreeViewStartEditing);

}
// private void TreeViewStartEditing(object sender, EventArgs e)
// {
// _isEditing = true;
// }
private void LeaveColumnTreeView(object sender, EventArgs e)
{
if(_isEditing)
{
_isEditing = false;
}
Invalidate();
ColumnTreeView.Hide();
}
private void ColumnTreeViewDoubleClick(object sender,EventArgs e)
{
if(_isEditing)
{
_isEditing = false;
SetColumnValueAtRow(_source,_rowNum, ColumnTreeView.SelectedNode.Text);
Invalidate();
}
ColumnTreeView.Hide();
_valueChanging(_rowNum , ColumnTreeView.SelectedNode.Tag); 
}
protected override void Edit(System.Windows.Forms.CurrencyManager source, int rowNum, System.Drawing.Rectangle bounds, bool readOnly, string instantText, bool cellIsVisible)
{
base.Edit(source,rowNum, bounds, readOnly, instantText , cellIsVisible); _rowNum = rowNum;
_source = source;
_isEditing = true; ColumnTreeView.Parent =this.TextBox.Parent;
ColumnTreeView.Location =new System.Drawing.Point(this.TextBox.Location.X,this.TextBox.Location.Y+20);
ColumnTreeView.Size =new System.Drawing.Size(this.TextBox.Size.Width*2,this.TextBox.Size.Height * 6); this.TextBox.Visible = false;
ColumnTreeView.Visible =true;
ColumnTreeView.BringToFront();
ColumnTreeView.Focus();
} protected override object 
GetColumnValueAtRow(System.Windows.Forms.CurrencyManager source, 
int rowNum)
{
// Given a row number in the DataGrid, get the display member
object obj =  base.GetColumnValueAtRow(source, rowNum);
     
MyTreeView tv=new MyTreeView();
TreeNode getnode=new TreeNode();
foreach(TreeNode node in ColumnTreeView.Nodes)
{
if (node.Tag == obj)
getnode = node ;
else
tv.GetNode(ref getnode,node,obj.ToString());
}
return getnode.Text;
}
protected override void 
SetColumnValueAtRow(System.Windows.Forms.CurrencyManager source,
int rowNum, object value)
{
object s = value;
base.SetColumnValueAtRow(source, rowNum, s);
}
protected override bool Commit(System.Windows.Forms.CurrencyManager dataSource, int rowNum)
{
if(_isEditing)
{
_isEditing = false;
SetColumnValueAtRow(dataSource, rowNum, ColumnTreeView.SelectedNode.Text);
}
return true;
}
}
}