我开始的时候先写了一个测试程序,有一个DATAGRID和一个BUTTEN按钮,当我执行程序后,先修改DATAGRID中的第1个选中单元格的数据后,马上点BUTTEN按钮去查看DATASET中HasChanges()是否有变化,系统提示数据已经修改。
  然后我在正式程序中使用的是DATAGRID和toolbar_butten按钮,问题就出现了,当我将第1个选中单元格的数据后马上查看DATASET中HasChanges()系统提示数据没有改变!并且我还发现如果我不将鼠标选中别的行数据,不管在第1选中行中修改哪个列的数据系统都会提示数据没有改变。除此以外我还发现,如果我在检查数据更新以前先执行 ds.AcceptChanges()在断点跟踪时发现DATASET中的数据已经改变,但是使用HasChanges()去检查系统还是给我返回数据未更改
   救命啊这里是出了什么问题啊!!!
   代码如下:
   if(!this.ds.HasChanges())
    {
      MessageBox.Show ("您还没有修改数据?", "信息提示",MessageBoxButtons.OK, MessageBoxIcon.Question);
     }

解决方案 »

  1.   

    toolBar_Button点击时焦点还在datagrid上没有离开,就相当于你还改完,随便把焦点移到别的哪个控间上就行
      

  2.   

    在检查 HasChanges之前,请做如下事件1)CurrencyManager.EndCurrentEdit();2) 最简单有效的方法dataGrid.Enabled = false;
    dataGrid.Enabled = true;
    if(!this.ds.HasChanges())
    {
    MessageBox.Show ("您还没有修改数据?", "信息提示",MessageBoxButtons.OK, MessageBoxIcon.Question);
    }
      

  3.   

    this.BindingContext(ds,"tablename").EndCurrentEdit();//先结束当前行编辑
    //UpdateDB....
      

  4.   

    这个办法我做过了,没有用啊!我设置焦点到一个LABLE上,BUTTEN上都不可以啊!!
    上边的兄台还有什么别的办法吗?
      

  5.   

    最简单有效的方法dataGrid.Enabled = false;
    dataGrid.Enabled = true;
    if(!this.ds.HasChanges())
    {
    MessageBox.Show ("您还没有修改数据?", "信息提示",MessageBoxButtons.OK, MessageBoxIcon.Question);
    }试过了没有????可以的。
      

  6.   

    to :weisunding(鼎鼎) 
    你说的
    dataGrid.Enabled = false;
    dataGrid.Enabled = true;
    办法也好象不可以!我断点看见数据都还没改变还是原来的。。
      

  7.   

    this.BindingContext(ds,"tablename").EndCurrentEdit()
      

  8.   

    to   haoztao(.NET一族) this.BindingContext(ds,"tablename").EndCurrentEdit()
    和刚才说的一样我断点看见数据都还没改变还是原来的。
    数据还是没有改变啊!!
    我在处理的时候先执行DS.AcceptChanges()还能将值改变了,但是这里值都没有变化啊!!是不是我DATAGRID的设置或者别的什么问题错了??
      

  9.   

    DATAGRID上顯示的實際是DataTable的DataView的內容.
    所以在判斷HasChanges()前﹐必須結束DataGrid的編輯同時DataView的當前綁定行要EndEdit().
    你的問題主要是DataGrid沒有結束編輯狀態。Button可以接受Focuse,所以點擊Button后DataGrid可以結束編輯狀態,但是toolbar_butten不能接受Focuse,所以DataGrid并沒有結束編輯狀態.
    解決方法是:在點擊toolbar_butten之前,先讓DataGrid失去焦點﹐再執行
    this.BindingContext(ds,"tablename").EndCurrentEdit()
    看看是不是變了!
      

  10.   

    讓DataGrid最后的更改有效也可以用SendKeys.Send("{Right}");
      

  11.   

    TO: sqfeiyu(流星雨)
    SendKeys.Send("{Right}");
    能写具体点吗??
      

  12.   

    to sqfeiyu(流星雨)你好!我现在的问题是,在执行HasChanges()的时候,所有行的状态都是“Unchanged”,根本DATASET就没有发现有修改状态的行。执行EndCurrentEdit()是没有意义的啊。
      

  13.   

    to sqfeiyu(流星雨)并且我这里如果不先执行this.ds.AcceptChanges();我的DATASET中就没有更新数据,数据都是老的。
      

  14.   

    如先執行AcceptChanges()后再執行HasChanges()肯定是沒有的;
    最好用一個DataTable來查看.將DataGrid綁定到DataTable上后,更改DataGrid﹐然后查看Table的DataView(一定要是DataView﹐因為DataTble此時還未更改)
    另外你可以用DataTable.Select查看System.Data.DataViewRowState.ModifiedCurrent的資料行﹐看看是否有更改的,或 System.Data.DataViewRowState.Added查看添加的行
      

  15.   

    因为你点击toolbar,DataGrid是没有失去焦的,而点Form上的Button却不一样。
    为了达到更新的目的,就模拟DataGrid换一下行就行了。
    下面的dg是一个DataGrid变量,为了代码重用,你可以把下面的方法写在DataGrid的继承类里.
    public void AcceptChange()
    {
    if(dg.DataSource == null) return;
    BindingManagerBase bm=dg.BindingContext[dg.DataSource,dg.DataMember];
    if(bm.Position==-1)return;
    try
    {
    int row = dg.CurrentCell.RowNumber;
    dg.CurrentCell = new DataGridCell(row + 1,dg.CurrentCell.ColumnNumber);
    dg.CurrentCell = new DataGridCell(row,dg.CurrentCell.ColumnNumber);
    }
    catch(Exception ex)
    {
                //
    }
    }
      

  16.   

    注:你点toolbar时就调用上面的方法。
      

  17.   

    to sqfeiyu(流星雨) 我检查的就是DataView的值,如果我不调用AcceptChanges(),里边的值是没有改变的,在执行HasChanges()的时候,所有行的状态都是“Unchanged”。找不到修改的。
      

  18.   

    to MyLf(不睡觉的鱼) 
    如果用户查到的数据只有一条不是要出问题?
      

  19.   

    3tzjq(永不言弃) ( ) 信誉:110  2005-08-08 10:32:00  得分: 0  
     
     
       this.BindingContext(ds,"tablename").EndCurrentEdit();//先结束当前行编辑
    //UpdateDB....
      
     
    你如果是在工具条按钮事件里调用该方法,数据的变动会更新到DataSet中的。除非除非DataGrid和ds没有绑定上。
      

  20.   

    我这里确实得到了数据,怎么会没绑定呢?我绑定的语句是
    this.ds=conn.get_dataset(comm);
    this.dataGrid1.DataSource=ds.Tables[0];
    不过我这里确实有个地方操作和别的不一样,我由于要控制列的颜色,所以定义了DATAGRID中的格,才去绑定的数据。不知道这个会不会有影响
      

  21.   

    我还是没有能直接得到数据是否修改的系统提示,不过我在“MyLf(不睡觉的鱼) ”的提醒下想了个办法就是将数据先新增一行,再移动到这行,再删除这行。
    this.ds.Tables[0].Rows.Add(ds.Tables[0].NewRow());
    this.next_nell();//模拟鼠标移动
    this.ds.Tables[0].Rows.RemoveAt(ds.Tables[0].Rows.Count-1);
    这样数据就改变了,谢谢大家的帮忙,这里我也不再纠缠了,给大家发分!!!感谢大家,如果还有什么好的提议我们做为技术讨论