public class DataGridTreeTextBoxColumn : DataGridTextBoxColumn 
{
//自己继承了一个类 
//重载了他的paint方法
protected override void Paint(System.Drawing.Graphics g, 
 
System.Drawing.Rectangle bounds, System.Windows.Forms.CurrencyManager 
 
source, int rowNum, System.Drawing.Brush backBrush, System.Drawing.Brush 
 
foreBrush, bool alignToRight)  
{
/*
我如果得到正在重画的这一行对应datatable的哪一行 
这个rowNum参数是grid的行号 
当我这样用的时候
  if (the_datatable_.Rows[rowNum]["haschild"].ToString()=="False")
显然是错误的 
因为当用视图筛选后这个rowNum就不对应datatable的那一行了 
*/
}
}问题:
怎样根据paint传过来的参数定位到datatable对应的行(这个datatable已知)

解决方案 »

  1.   

    http://www.syncfusion.com/FAQ/WindowsForms/Default.aspx#44
    这个里面比较全面,你可以在这里面找找看!
      

  2.   

    给你一个DataGridComBoxColumn public class DataGridComboBoxColumn : DataGridTextBoxColumn
    {
    public NoKeyUpCombo ColumnComboBox = null;
    private System.Windows.Forms.CurrencyManager _source = null;
    private int _rowNum;
    private bool _isEditing = false;
    ComboValueChanged _valueChanging;

    public DataGridComboBoxColumn(ComboValueChanged valueChanging) : base()
    {
    _valueChanging = valueChanging;
    ColumnComboBox = new NoKeyUpCombo();

    ColumnComboBox.Leave += new EventHandler(LeaveComboBox);
    // ColumnComboBox.Enter += new EventHandler(ComboMadeCurrent);
    ColumnComboBox.SelectedIndexChanged += new System.EventHandler(ComboIndexChanged);
    ColumnComboBox.SelectionChangeCommitted += new System.EventHandler(ComboStartEditing);

    }
    private void ComboStartEditing(object sender, EventArgs e)
    {
    _isEditing = true;
    base.ColumnStartedEditing((Control) sender);
    }

    private void ComboIndexChanged(object sender, EventArgs e)
    {
    _valueChanging(_rowNum , ColumnComboBox.Text); 
    } private void ComboMadeCurrent(object sender, EventArgs e)
    {
    //_isEditing = true; 
    }

    private void LeaveComboBox(object sender, EventArgs e)
    {
    if(_isEditing)
    {
    SetColumnValueAtRow(_source, _rowNum, ColumnComboBox.Text);
    _isEditing = false;
    Invalidate();
    }
    ColumnComboBox.Hide();


    } 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;

    ColumnComboBox.Parent = this.TextBox.Parent;
    ColumnComboBox.Location = this.TextBox.Location;
    ColumnComboBox.Size = new Size(this.TextBox.Size.Width, ColumnComboBox.Size.Height);
    ColumnComboBox.SelectedIndexChanged -= new System.EventHandler(ComboIndexChanged);
    ColumnComboBox.Text =  this.TextBox.Text;
    ColumnComboBox.SelectedIndexChanged += new System.EventHandler(ComboIndexChanged); this.TextBox.Visible = false;
    ColumnComboBox.Visible = true;
    ColumnComboBox.BringToFront();
    ColumnComboBox.Focus();
    } protected override bool Commit(System.Windows.Forms.CurrencyManager dataSource, int rowNum)
    {
    if(_isEditing)
    {
    _isEditing = false;
    SetColumnValueAtRow(dataSource, rowNum, ColumnComboBox.Text);
    }
    return true;
    }
    } public class NoKeyUpCombo : ComboBox
    {
    const int WM_KEYUP = 0x101;
    protected override void WndProc(ref System.Windows.Forms.Message m)
    {
    if(m.Msg == WM_KEYUP)
    {
    //ignore keyup to avoid problem with tabbing & dropdownlist;
    return;
    }
    base.WndProc(ref m);
    }
    }
      

  3.   

    不知道对你是否有用,我是想写dataGrid的comboxcolum,用来在dataGrid中嵌套的。
      

  4.   

    有用呵呵,我是写一个treecolumn,和你的思路不大一样 呵呵
    我QQ 24915898 可以常联系
      

  5.   

    二楼的难道也是从我说的那个网站上下载下来的例子?嘿嘿!大家都是同道中人!我只有MSN
      

  6.   

    现在的问题如何找到dataview的第i行数据对应到datatable的第j行,这个j=?
      

  7.   

    搞定了
    DataRowView myDataRowView =(DataRowView)source.List[rowNum];
    string temp_hasChild=myDataRowView.Row["haschild"].ToString();
    string temp_Extended=myDataRowView.Row["extended"].ToString();
    结贴