0

ページの読み込み時に fill メソッドで読み込まれる大規模なデータセットがあります。

次に、レコードをデータセットに追加できます。

これらはすべて正常に機能しますが、バインディングソースに新しいレコードを認識させる唯一の方法は、fill メソッドを実行することです。これも機能しますが、パフォーマンスの問題です。バインディング ソースがデータセット内の新しいレコードを認識しないのはなぜですか?

メインフォーム コード。よく働く。

         DialogResult returnFormVal;

        Schedulers.DataSets.SchedOneFetch.WOMainFetchRow newRow = schedOneFetch.WOMainFetch.NewWOMainFetchRow();

        Schedulers.Forms.NewWorkOrder genReport = new Schedulers.Forms.NewWorkOrder(ref newRow);

        Int32 picNumber;

        returnFormVal = genReport.ShowDialog();

        schedOneFetch.WOMainFetch.Rows.Add(newRow);

        wOMainFetchBindingSource.EndEdit();

        wOMainFetchTableAdapter.Adapter.Update(schedOneFetch.WOMainFetch);

        Int32 passBackVal = newRow.DISID;

サブフォーム コード。また、素晴らしい作品。

            passBackRow.DISDueDate = monthCalendar1.SelectionStart;

            passBackRow.DISID = 99999999;

            if (ckbEqpt.Checked == true & lbProcNum.Items.Count > 0)
            {
                passBackRow.DISEquip = Convert.ToInt32(lbProcNum.SelectedValue.ToString());
            }
            else
            {
                passBackRow.DISEquip = 0;
            }


            passBackRow.DISLineNumber = Convert.ToInt32(lbLineName.SelectedValue.ToString());

            passBackRow.DISManHours = Convert.ToInt32(nudEstTotTime.Value);

            passBackRow.DISNumberAss = Convert.ToInt32(nudEstTM.Value);

            passBackRow.DISOpenDate = DateTime.Now;

            passBackRow.DISOriginator = userID.DBUserID;

            passBackRow.DISRequestor = 0;

            passBackRow.DISResponsible = Convert.ToInt32(lbRespons.SelectedValue.ToString());

            passBackRow.DISType = Convert.ToInt32(lbType.SelectedValue.ToString());

            passBackRow.DISWorkAccomp = "";

            passBackRow.DISWorkRequired = rtbWorkReq.Text;

            passBackRow.MLID = 0;

            passBackRow.LIID = 0;

            passBackVal = 0;

            this.Close();

制御をメイン フォームに戻します。新しいレコードがデータベースに追加されました。

                wOMainFetchBindingSource.Position = wOMainFetchBindingSource.Find("DISID", passBackVal);


            DataRowView dtaRow = (DataRowView)wOMainFetchBindingSource.Current;

            String woID = dtaRow["DISID"].ToString();

不合格!bindingsource は新しいレコードを見つけられず、検索時に -1 を返し、デフォルトでデータセットの最初のレコードになります。

ダイアログとメイン ページの間に .fill メソッドを配置すると、すべて正常に動作しますが、塗りつぶしにかなりの時間がかかります... 7 ~ 8 秒。

バインディング ソースに関する私の理解は機能していないと思います。基礎となるデータセットが更新された場合、バインディング ソースがそれを見ると想定していました。

したがって、最初に誰かが塗りつぶしなしでバインディング ソースを更新する方法について提案を持っている場合、私はそれを感謝します.

ありがとう

4

1 に答える 1

0

Bindingsource についての私の理解は正しかったです。新しいレコードが追加されました。問題は、データセットがビューから情報を取得することです。add new メソッドは、ベース テーブルのフィールドにデータを入力するだけです。ビューによってアセンブルされたその他のフィールドは、fill メソッドを使用して tableadapter が再読み取りを行うまで、入力されません。新しいレコードの各フィールドに入力する以外にこれを回避する方法はありません。大きな欠点は、ビューまたはビューで組み立てられたテーブルが変更されるたびに、必ずコードを変更する必要があることです。代わりに、各フィルでロードされるレコードの数を減らします。

于 2012-06-16T15:20:07.017 に答える