none
データセットのコピー RRS feed

  • 質問

  • ドロップダウンの項目をデータベースから取ってくるような場合、
    フォームを開くたびに、毎回データセットをFillするのを避ける為に、
    アプリケーションの起動時に1回だけFillを行って、そのデータセットを
    アプリケーションの終了時まで使いたいと思っています。

    各フォーム上では、仮のデータセットをつくり、それに対して
    データバインドをしています。

    そしてフォームを開いた際に起動時にFillを行ったプロジェクト全体の
    データセットを、各フォーム内のデータセットにコピーするのですが、
    これが上手くいきません。

    アプリケーションの起動時にFillしたデータセットをcommon.globalDataSetとし、
    フォーム内のデータセットをmyDataSetとして、

    this.myDataSet = common.globalDataSet;

    としても、this.myDataSetにはcommon.globalDataSetの内容が上手くコピーされません。

    これは何が問題でしょうか?解決方法はないものでしょうか。
    2006年12月22日 4:52

すべての返信

  • DataSet.Copy()でいいと思います。
    2006年12月22日 6:38
    モデレータ

  • 提示のコードでは、コピーじゃなくて参照代入になってしまいますね。
    ココ↓の「オブジェクトの作成」のところで、そのあたりが少し書いてあります。
    http://msdn2.microsoft.com/ja-jp/library/x9afc042(VS.80).aspx

    こちら↓がそこらへん分かりやすいかも。
    http://ufcpp.net/study/csharp/oo_reference.html#reftype

    2006年12月22日 7:47
  • 参照代入で構いませんよ。
    その方がメモリー消費も少ないです。

    この場合うまくいかないのはデータバインドを代入したDataSetに対してやっていないからでしょう。

    this.textBox1.DataBindings.Clear();
    this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.ユーザーDataSet, "ユーザー.都道府県名", true));

    this.xxxBindingNavigator.BindingSource = this.ユーザーDataSet;

    2006年12月22日 8:55
  • カスタムコントロールを作ってしまう手もあります。

        public partial class 都道府県ComboBox : ComboBox

        {

            public 都道府県ComboBox()

            {

                InitializeComponent();

                if (都道府県DataSet == null)

                {

                    InitializeDataSet();

                }

                this.bindingSource.DataSource = 都道府県DataSet;

                this.ValueMember = "都道府県.コード";

                this.DisplayMember = "都道府県.都道府県名";

            }

     

            static private SampleApplication.Data.都道府県DataSet 都道府県DataSet = null;

            static private SampleApplication.Data.都道府県DataSetTableAdapters.都道府県TableAdapter 都道府県TableAdapter;

     

            private void InitializeDataSet()

            {

                都道府県DataSet = new SampleApplication.Data.都道府県DataSet();

                都道府県TableAdapter = new SampleApplication.Data.都道府県DataSetTableAdapters.都道府県TableAdapter();

                ((System.ComponentModel.ISupportInitialize)(都道府県DataSet)).BeginInit();

     

                都道府県DataSet.DataSetName = "都道府県DataSet";

                都道府県DataSet.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;

     

                都道府県TableAdapter.ClearBeforeFill = true;

                ((System.ComponentModel.ISupportInitialize)(都道府県DataSet)).EndInit();

            }

     

            protected override void InitLayout()

            {

                base.InitLayout();

                if (!this.DesignMode)

                {

                    都道府県TableAdapter.Fill(都道府県DataSet.都道府県);

                }

            }

        }

    2006年12月22日 9:10
  • この例では毎回読みなおす例なので、
    if(都道府県DataSet.都道府県.Count == 0) で条件かけたりフラグを持ったりしないと、
    だめですけどね。

    2006年12月22日 9:14