none
請教一個應用off-line DataSet & DataBinding的問題. RRS feed

  • 問題

  • 請教各位先進,

    我的開發環境為VS.Net 2005/C#/WinForm,專案中有個自訂型別的DataSet,而UI上有幾個CheckBox並且設定了DataBinding連結到專案中的DataSet.DataTable中的個別特定欄位,顯示方式都能按照預期表現出來.

    問題是,當我利用UI上的CheckBox並試著改變其勾選的狀態,然後接著用DataSet.GetChanges(DataRowState.Modified).GetXml()查看資料的狀況,這時沒有發現有任何資料列(出現在Unchanged),但若接著以DataSet.GetXml()來查看,卻發現該筆資料確已有變更,那為何沒有辦法利用GetChanges()來提取出來呢??(在呼叫AcceptChanges()前...)

    如果不利用DataBinding的方式,直接改變DataSet內的值,用GetChanges()是可以提取出變更的資料列.

    查詢Help文件寫到,當用DataBinding且對象為DataSet時,實際上是Binding到DataRowView,那我應該怎麼處理來這個狀況?因為必需要使用到GetChanges()來提取異動的資料後呼叫相關的WebServices來異動後端的資料庫.

    2006年4月20日 下午 05:23

解答

  •         private void button2_Click(object sender, EventArgs e)
            {
                _bindingSource.EndEdit();
                DataSet ds = _dataset.GetChanges(DataRowState.Modified);

                if (ds != null)
                    MessageBox.Show(ds.GetXml());
            }

    玩了幾天,總是找到少了什麼點東西了....^^

    2006年4月22日 上午 03:32

所有回覆

  • using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            private DataSet1 _dataset = new DataSet1();

            private BindingSource _bindingSource = null;

            public Form1()
            {
                InitializeComponent();

                _bindingSource = new BindingSource(_dataset, "DataTable1");
               
                Binding binding = new Binding("Checked", _bindingSource, "online");
                binding.Format += new ConvertEventHandler(Form1_Format);
                binding.Parse += new ConvertEventHandler(Form1_Parse);

                checkBox1.DataBindings.Add(binding);
            }

            void Form1_Parse(object sender, ConvertEventArgs e)
            {
                if (e.Value.Equals(true))
                    e.Value = 'y';
                else
                    e.Value = 'n';
            }

            private void button1_Click(object sender, EventArgs e)
            {
                _bindingSource.SuspendBinding();

                DataSet1.DataTable1DataTable table = new DataSet1.DataTable1DataTable();
                for (int i = 0; i < 10; i++)
                {
                    DataSet1.DataTable1Row r = table.NewDataTable1Row();

                    r.online = 'y';
                    table.Rows.Add(r);
                }

                DataTableReader reader = table.CreateDataReader();
                _dataset.DataTable1.Clear();
                _dataset.DataTable1.Load(reader, LoadOption.OverwriteChanges);
                _dataset.DataTable1.AcceptChanges();

                _bindingSource.ResumeBinding();
            }

            void Form1_Format(object sender, ConvertEventArgs e)
            {
                if (e.Value.Equals('y'))
                    e.Value = true;
                else
                    e.Value = false;
            }

            private void button2_Click(object sender, EventArgs e)
            {
                DataSet ds = _dataset.GetChanges(DataRowState.Modified);

                if (ds != null)
                    MessageBox.Show(ds.GetXml());
            }
        }
    }

    這是測試用的程式碼,試過直接拉DataSet&BindingSource並且設定屬性來做,狀況是一樣的,大概的流程是這樣,按下button1模擬預先存在資料,在UI上變更checkbox的狀態,再按button2來提取變更的資料集.

    試了一段時間,會不會是少做了什麼步驟呢??請大家指教.

    2006年4月21日 下午 03:02
  •         private void button2_Click(object sender, EventArgs e)
            {
                _bindingSource.EndEdit();
                DataSet ds = _dataset.GetChanges(DataRowState.Modified);

                if (ds != null)
                    MessageBox.Show(ds.GetXml());
            }

    玩了幾天,總是找到少了什麼點東西了....^^

    2006年4月22日 上午 03:32