遇到一个很怪的问题.我只是放置了一个Bindingsource及有类型的DataSet到窗体中,然后用数据适配器填入数据到表,BindingSource绑定DataSet中的一个表.窗体上没有任何控件.当我改变BindingSource.Position的属性时,发现BindinSource总会自动调用BeginEdit();因为我检测到((DataRowView)MyPars.BindingSource.Current).IsEdit==true,但BindingSource这个特性使我很烦恼.因为BeginEdit后,根据上面的IsEdit属性,我就当此项记录已经编辑过,并询问用户是否要保存...BindingSource自动BeginEdit使我这个判断工作很不好处理,如何是好?

解决方案 »

  1.   

    我研究出办法了~
    楼主用(datatable.getchange()!=null)来判断是否发生变化(Datatable初始化完务必datatable.acceptchange()一次!!)
      

  2.   

    回复楼上,不行的.好象我在一个记录中,在文本框更改了数据但未提交.可此时GetChanges()==null,所以没有用.我是想实现:
    用户在数据行中浏览了一记录后按"next"跳到另一个记录中,而此时用户很可能无意中编辑过了.所以按"NEXT"按钮时,如果记录已经编辑过(因为此时用户未按"Post"按钮,是没有调用过EndEdit),则要询问一下用户是否要提交记录?这是一个可编辑数据的环境,但上面的做法是为了避免用户误编辑记录又不知道~~~觉得ADO时,做这个很好做呀~~
      

  3.   

    我又去试了,是可以的,代码如下        private void Form1_Load(object sender, EventArgs e)
            {
                
                //数据源
                dt.TableName = "XXX";
                dt.Columns.Add("id", typeof(int));
                dt.Columns.Add("Menu_name", typeof(string));
                dt.Columns.Add("ParentID", typeof(int));
                dt.Rows.Add(1, "菜单", 0);
                dt.Rows.Add(3, "重庆", 1);
                dt.Rows.Add(4, "天津", 1);
                dt.Rows.Add(5, "陕西省", 1);
                dt.Rows.Add(8, "西安市", 5);
                dt.Rows.Add(9, "广州市", 6);
                dt.Rows.Add(10, "扶风", 8);
                dt.Rows.Add(11, "深圳", 6);
                dt.Rows.Add(12, "广东省", 1);
                dt.Rows.Add(13, "AAA", 10);
                dt.Rows.Add(14, "AAA", 5);
                dt.AcceptChanges();
                bs.DataSource = dt;
                txtID.DataBindings.Add("Text", bs, "id");
                bs.PositionChanged += new EventHandler(bs_PositionChanged);
            }        void bs_PositionChanged(object sender, EventArgs e)
            {
                bs.EndEdit();
                if (dt.GetChanges() != null)
                {
                    if (MessageBox.Show("是否保存", "提示", MessageBoxButtons.OKCancel) == DialogResult.Cancel)
                        dt.RejectChanges();
                    else
                        dt.AcceptChanges();
                }
            }
    如果还不行,PM我~
      

  4.   

    楼上的老兄。。你使用了AcceptChanges和RejectChanges。可我还要按“保存”把dt的内容用适配器保存到数据库,调用了这两个方法之一,就等于白做了~~~
      

  5.   

    呵呵,我找到更好的解法了,可以不用IsEdit或IsNew来判定.DataRow r = ((DataRowView)tab单位BindingSource.Current).Row;
    if (r.HasVersion(DataRowVersion.Proposed))
    {
      //此记录编辑过或在新增状态,新增状态时所有r[Datacolumn, DataRowVersion.Proposed]的值为Null.
    }