可以自己定义一个dataGrid的列,重写里面的textBox的方法或事件来实现.

解决方案 »

  1.   

    类的定义参考如下:
    public class TextColumnStyle : System.Windows.Forms.DataGridTextBoxColumn
    {
    public TextColumnStyle()
    {
    // 
    // TODO: 在此处添加构造函数逻辑
    //
    } protected override bool Commit(System.Windows.Forms.CurrencyManager dataSource, int rowNum)
    {
    // TODO:  添加 TextColumnStyle.Commit 实现 string[] s = this.TextBox.Text.Split( new char[]{'+'});
    if (s != null && s.Length ==2 )
    {
    int v = int.Parse(s[0])+int.Parse(s[1]);
    SetColumnValueAtRow(dataSource, rowNum, v);
    }
    return base.Commit (dataSource, rowNum);
    }
    }
    使用时类似如下的代码:
    public void SetListDataEX(DataView dvw)
    {
    if (tableStyle==null)
    {
    tableStyle = new DataGridTableStyle();
    tableStyle.MappingName =dvw.Table.TableName;
    int numCols = dvw.Table.Columns.Count;
    SqlDataServer.TextColumnStyle textColumn;
    for (int i=0;i<dvw.Table.Columns.Count;i++)
    {
    textColumn = new SqlDataServer.TextColumnStyle();
    textColumn.NullText="";
    textColumn.HeaderText = dvw.Table.Columns[i].Caption;
    textColumn.MappingName = dvw.Table.Columns[i].ColumnName;
    tableStyle.GridColumnStyles.Add(textColumn);
    } tableStyle.AllowSorting=false;
    tableStyle.RowHeadersVisible=false;
    this.dataGrid1.TableStyles.Clear();
    this.dataGrid1.TableStyles.Add(tableStyle);
    }
    this.dataGrid1.BeginInit();
    this.dataGrid1.SetDataBinding(dvw,null);
    this.dataGrid1.EndInit();
    dvw.AllowDelete=true;
    dvw.AllowEdit=true;
    m_ListDataView=dvw;
    }
    你自己再改一下就OK了!
      

  2.   

    改了一下,这是一个较完整的例子了:
    public class TextColumnStyle : System.Windows.Forms.DataGridTextBoxColumn
    {
    public TextColumnStyle()
    {
    // 
    // TODO: 在此处添加构造函数逻辑
    //
    } protected override bool Commit(System.Windows.Forms.CurrencyManager dataSource, int rowNum)
    {
    // TODO:  添加 TextColumnStyle.Commit 实现 /// 类似20+30的输入提交时自动算为50的列类型; string[] s = this.TextBox.Text.Split( new char[]{'+'});
    if (s != null && s.Length ==2 )
    {
    int v = int.Parse(s[0])+int.Parse(s[1]);
    SetColumnValueAtRow(dataSource, rowNum, v);
    }
    return base.Commit (dataSource, rowNum);
    }
    }DataGridTableStyle tableStyle =null;
    public void SetListDataEX(DataView dvw)
    {
    if (tableStyle==null)
    {
    tableStyle = new DataGridTableStyle();
    tableStyle.MappingName =dvw.Table.TableName;
    int numCols = dvw.Table.Columns.Count;
    TextColumnStyle textColumn;
    for (int i=0;i<dvw.Table.Columns.Count;i++)
    {
    textColumn = new TextColumnStyle();
    textColumn.ReadOnly=false;
    textColumn.NullText="";
    textColumn.HeaderText = dvw.Table.Columns[i].Caption;
    textColumn.MappingName = dvw.Table.Columns[i].ColumnName;
    tableStyle.GridColumnStyles.Add(textColumn);
    } tableStyle.AllowSorting=false;
    tableStyle.RowHeadersVisible=false;
    this.dataGrid1.TableStyles.Clear();
    this.dataGrid1.TableStyles.Add(tableStyle);
    }
    this.dataGrid1.BeginInit();
    this.dataGrid1.SetDataBinding(dvw,null);
    this.dataGrid1.EndInit();
    dvw.AllowDelete=true;
    dvw.AllowEdit=true;
    }
    private void button1_Click(object sender, System.EventArgs e)
    {
    string strConn="server=(local);database=mydata;uid=sa;pwd=sa";
    SqlConnection cn=new SqlConnection(strConn);
    SqlDataAdapter ada=new SqlDataAdapter();
    ada.SelectCommand=new SqlCommand("select * from system_personnel",cn);
    DataSet ds=new DataSet();
    ada.Fill(ds);
    this.SetListDataEX(ds.Tables[0].DefaultView);
    }