如果字段不都显示在datagrid中,那么输入数据不要从datagrid中输入好了。可以分开例如全从textbox输入

解决方案 »

  1.   

    再加个确定按钮,输入完后保存记录数据并刷新datagrid
      

  2.   

    绑定到dataTable.DefaultView 上试试看;
    再不行 ,用CurrencyManager绑定;
      

  3.   

    笨一点但有效的方法,拖几个隐藏的TextBox,binding那些在DataGrid中没有的字段
      

  4.   

    datagrid加个标识列,对应某个id,凡是新加的该值为-1,加的时候把所有该ID号为-1的加进去,之后datagrid重新绑定datatable.
      

  5.   

    http://blog.csdn.net/zhzuo/archive/2005/01/03/238273.aspx
      

  6.   

    DataRowView newRowView;
    BindingManagerBase bmb=ctrl.BindingContext [dataSource,dataMember]; //首先要得到绑定管理器
    CurrencyManager cm=null;
    if (bmb is CurrencyManager )
        cm =bmb as CurrencyManager ;
    else
        return ;
    IBindingList bindingList=(IBindingList)cm.List ;                    
    bindingList.ListChanged +=new ListChangedEventHandler(list_ListChanged);
    //在此事件中,只能改IsNew行的数据,且不能EndEdit()
    private void list_ListChanged(object sender, ListChangedEventArgs e)
    {
    try
    {
    if (e.NewIndex >=0  && listChangedType==ListChangedType.ItemAdded ) //必需这样断定,因为可能是ItemDelete,
    {
    newRowView=this.bindingList [e.NewIndex ] as DataRowView ;        //这行就是已添加但还没提交的行,在Table中找不到,IsNew为true,
    }
    else
    newRowView=null;
    }
    catch (System.Exception ex)
    {
    newRowView=null;
             }
    }
      

  7.   

    此是唯一办法,最佳办法, 我自己的问题我从来不会用偏门来解决.CurrencyManager .Current 都不是你要的Row,
    Rowchaning 事件也得不到,因为新行要EndEdit()后才会提交,才会发生Rowchaning 和 Rowchaned事件
    但我们要在EndEdit之前得到,不是吗?
    必需注意,rowchanging事件中不允许用endedit(),bindingList.ListChanged虽然没有不允许,但也是不能用的,
      

  8.   

    if (e.NewIndex >=0  && e.listChangedType==ListChangedType.ItemAdded )
    这句报错:D:\matrix\source\repsta\forms\w_paigong_pop.cs(228): 不可访问“System.ComponentModel.ListChangedEventArgs.listChangedType”,因为它受保护级别限制怎么解决?
      

  9.   

    我发现了c#的一个bug,请看如下代码: private void list_ListChanged(object sender, System.ComponentModel.ListChangedEventArgs e)
    {
    // try
    // {
    // if (e.listChangedType==ListChangedType.ItemAdded && e.NewIndex >=0) //必需这样断定,因为可能是ItemDelete,
    // //if (e.NewIndex >=0  && a=="ITEMADDED" ) //必需这样断定,因为可能是ItemDelete,
    // {
    // newRowView=this.bindingList [e.NewIndex ] as DataRowView ;        //这行就是已添加但还没提交的行,在Table中找不到,IsNew为true,
    // }
    // else
    // newRowView=null;
    // }
    // catch (System.Exception ex)
    // {
    // newRowView=null;
    // }
    try
    {
    if(e.NewIndex >= 0 && e.ListChangedType == ListChangedType.ItemAdded)
    {
    newRowView = this.bindingList [e.NewIndex] as DataRowView;
    }
    else newRowView = null;
    }
    catch (System.Exception ex)
    {
    MessageBox.Show(ex.ToString());
    newRowView = null;
    }
    }
    注释掉的try{}catch{}和没有注释掉的完全一样,但是被注释的那段if (e.NewIndex >=0  && e.listChangedType==ListChangedType.ItemAdded ) 这句报错:D:\matrix\source\repsta\forms\w_paigong_pop.cs(228): 不可访问“System.ComponentModel.ListChangedEventArgs.listChangedType”,因为它受保护级别限制而没注释的那段就可以正常运行。