• ベストアンサー

VB.netでフォームのクローン

VB.net2013にて、フォームアプリ作成中です。 アプリの構成としては、 Aフォーム、Bフォームの2画面があり Aフォームの呼出ボタンにより、フォームを呼び出す仕組みです。 Bフォームでは、データ編集できる 下記のような入力コントロールが多数配置されています。 ・テキストボックス ・スプレッドシート ・ラジオボタン ・ユーザコントロール各種 等々 ※Aフォームには、編集状態を保持するために Bフォームのインスタンスを保持しています。 Bフォームには、キャンセルボタンが配置してあり、 これにより編集状態を、画面を開きなおした段階まで戻したいと思っています。 Bフォームを表示する際に、 Aフォームの保持している、Bフォームのインスタンスを クローンコピーし退避しておくことで Bフォームクローンで元に戻そうと構想しています。 ◾︎案1ーーー memberwisecloneのクローンでは、 Bフォームの参照型のメンバをディープコピー出来ないようでした。 ーーーーーー ◾︎案2 ーーー 下記参考サイトより、 メモリ上に一旦シリアライズして、コピーする方法は、 基底であるFormクラスがシリアライズできないため こちらも出来ませんでした。 d.hatena.ne.jp/tekk/touch/20100131/1264913887 ーーーーーー フォーム上のコントロールをクローンする 他に良い方法はないでしょうか? 案1では、値型のメンバはmemberwisecloneでクローン出来たため 残りのコントロールをどのようにディープコピーするかで 悩んでいます。 InvokeMemberなるもので、対象のコントロールについて 別インスタンスを生成するというところは出来たのですが コントロールの編集途中までの各種プロパティ値までは 引き継がれませんでした。 やはり別インスタンスとしたところに 再度入力値を設定しなおしてあげる必要があるのでしょうか? 作業工数と、汎用性を考えると もっと他に良い方法があるのではないか とは思うのですが・・・ もしよりよい方法をご存知の方いらっしゃいましたら ご教授願います。よろしくお願いいたします。

  • -0-y
  • お礼率75% (59/78)

みんなが選んだベストアンサー

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

> フォーム上のコントロールをクローンする > 他に良い方法はないでしょうか? クローンしない。 その代りに以下のようにする。 ・Bフォームで編集するデータを表すクラス(以下、「データクラス」と略記)を用意する。 ・Bフォームにデータクラスのインスタンスをもとにフォームの状態を変更するメソッド(以下、「状態変更メソッド」)を作る。 ・また、Bフォームに現在のフォームの状態からデータクラスのインスタンスを新規生成して返すメソッドを作る。 ・そのうえで、AフォームからBフォームを表示する際に、  (1) データクラスのインスタンスを生成する。  (2) Bフォームインスタンスを生成する。この時上記で生成したデータクラスインスタンスをBフォームに渡しておく。  (3) Bフォームでは渡されたデータクラスインスタンスを初期値として保持したうえで、状態変更メソッド呼び出す。  (4) 上記が終わったなら、AフォームでBフォームを表示させる。 ということを行う。 ・Bフォームでは初期値として保持しているデータクラスインスタンスは絶対変更しない。 ・Bフォームでキャンセルボタンが押された時、状態変更メソッドを呼び出す。これで表示状態は初期状態に戻る。 ・Bフォームが閉じたとき、AフォームではBフォームのデータクラスインスタンス生成メソッドを呼び出し、その戻り値をもとにもとのデータを修正する。 ……ところで、キャンセルボタンと書くと、どうしても「何もせずにフォームを閉じる」というイメージがあります。 問題のボタンは「初期値に戻す」ボタン、あるいは「リセット」ボタンと呼んだほうがよろしいかと思います。

-0-y
質問者

お礼

返信が遅くなりましたが、ありがとうございます。 これは私の書き方が悪かったので申し訳ないですが、 実装したいものは「何もせずにフォームを閉じる」でしたので リセットボタンではなく、キャンセルボタンということになります。 大変丁寧な回答感謝の限りで、申し訳ないのですが 他の方がこの質問回答を参考にされる方もいることを考えると 誤解を招いてしまうかもしれないため、ベストアンサーとできませんでした。 代わりにありがとうボタンとさせていただきたく思います。 感謝です。ありがとうございました!

その他の回答 (1)

  • wormhole
  • ベストアンサー率28% (1621/5656)
回答No.2

MVCでいえばViewにあたるFormにModelの役割もさせようとしてるのが、そもそもの間違いかと。 データはModelに持たせておいてFormの初期表示時にはModelを参照して表示、キャンセル時も同様。

-0-y
質問者

お礼

感謝します。この方法を参考に実装完了できました。 ありがとうございます!

関連するQ&A

  • C#のフォーム間のデータの受け渡しについて

    はじめまして。よろしくお願いします。 最近C#をはじめましたがいきなりつまづいてしまいました。 クラスを利用しフォーム間でデータの受け渡しをしたいのですがどうすればいいのでしょうか? 処理は以下のようになっております まず、フォームが2つあります。フォーム1とフォーム2とします。 最初に起動されるのがフォーム1で、フォーム1にはボタンが2つあります。ボタンA、ボタンBとします ボタンA、ボタンBどちらのボタンを押下しても、フォーム2が開きますがどちらを押されてたかをフォーム2のテキストボックス(テキスト2とします)に表示します。 クラスですがフォームが2つとデータ保持のためのクラスが1つ(データ保持クラスとします)があります。 データ保持クラスにはint形のBtnClickプロパティ(get,set)を作成しております。, フォーム1のボタンA押下時処理  データ保持クラスのBtnClickに1を格納し、フォーム2を開きます。 フォーム1のボタンB押下時処理  データ保持クラスのBtnClickに2を格納し、フォーム2を開きます。 フォーム2起動時処理  データ保持クラスのBtnClickから値を取得しフォーム2のテキスト2へ表示します。 で、肝心の質問ですが、データ保持クラスの宣言はどこにすればいいのでしょうか? また、インスタンスはどのタイミングで作成すればいいのでしょうか? フォーム1にpublicとして宣言しインスタンスを作成し、ボタン押下時にBtnClickプロパティーにデータを格納し・・・ というところまではできたのですが、フォーム2で値が取得できないどころか、コンパイルが通りません。 あと、こういうデータ保持クラス使い方って一般的ですか?? 長々と脈略もなく書きましたがご教授ください。どうぞよろしくお願いします。

  • ArrayListのcloneメソッド

    お世話になります。 ArrayListのcloneメソッドなんですが、API上は「ArrayList のインスタンスのシャローコピーを返します。要素自体はコピーされません。 」と記載がありますが、 「ディープコピー」をしているような感じがして、なぜ「シャローコピー」と言っているのか、教えて欲しいです。 しかも、要素自体もコピーされているような…。 自分の理解では、 シャローコピー:コピー元、コピー先で同じオブジェクトを参照する ディープコピー:コピー元、コピー先で違うオブジェクトを参照する 試したソースは以下です。 --------------- import java.util.ArrayList; public class Test { public static void main(String[] args) { ArrayList<String> array = new ArrayList<String>(); array.add("a"); array.add("b"); ArrayList<String> array2 = (ArrayList<String>) array.clone(); array2.add("c"); System.out.println("array:" + array); System.out.println("array2:" + array2); } } --------------- cloneメソッドはシャローコピーなので、array2で「c」がaddされたら、arrayも「c」が追加されて、 array:[a, b, c] array2:[a, b, c] となるはずが、 array:[a, b] array2:[a, b, c] となります。 array、array2は別々のオブジェクトを参照しているような気がします。 恐らく大きな勘違いをしているのかもしれませんが、 調べてもいまいち理解できませんでした。 お手数おかけしますが、よろしくお願い致します。

    • ベストアンサー
    • Java
  • WebBrowser内のフォームをsubmitする(VB2008)

    VB2008でWebBrowserコントロール内のsubmitボタンを以下のコードでクリックしようとしているのですが、 WebBrowser1.Document.Forms("フォームの名前").InvokeMember("submit") NullReferenceExceptionはハンドルされませんでした。 オブジェクト参照がオブジェクト インスタンスに設定されていません。 というエラーが出ます。 ボタンがフォームの中ではなく、tableの中に配置されているようで、idも指定されておらず、nameとvalueだけ指定されているのですが何か方法はないでしょうか。 どなたかお願いします。

  • クローンデータベース作成に関して

    サーバーAでOracleデーターベース(10g)が稼働しています(インスタンスは1つ)。 サーバーBに全く同じデータベースインスタンスを構築することを考えています。 サーバーBにはOracleはインスト済みです。 データだけを移すなら expdp/impdb を使ってスキーマ別に移すところですが、 データベースの様々な設定: アーカイブログの設定やSGAのサイズ等など、、、 も完全に同じものを構築したいと思っています。 ----------------------- 1. DBCA を使用 サーバーAでDBCAを使って、既存インスタンスからテンプレートを作成します。 次にそのファイルをサーバーBに移して、サーバーB上でDBCAを使って当該テンプレートからインスタンス作成 => この方法を一度試したのですが、よくわからない点がありました。テンプレートを使っている割には、インスタンス生成の各種パラメータを入力せねばなりません。入力した設定は無視されてテンプレートの値が使われるのでしょうか?それとも、入力した内容が優先されるのでしょうか?あるいはこの方法ではインスタンス生成のパラメータは移せないのでしょうか? 2. expdp/impdp でFULL=Y データベースをまるごとコピーというならこの方法でもいい気がしますが、まずはサーバーB上にインスタンスを作ってからimpdpをすることになると思います。 するとインスタンスの設定は移されないということになるのでしょうか? 3. その他の方法 何かもっと有効な方法がありますか? ------------------------------------- 何卒ご教示のほどをお願いします。

  • vb2008 フォームのコピー方法を教えて下さい

    windows xp でVB2008を使っています。 「プロジェクトA」のフォームを別の「プロジェクトB」にコピーして使用したいのですが、プロジェクト間のコピー方法が良く分かりません。 フォームのエクスポート・インポートも見当たらないし・・ 初心者でゴメンなさい。教えて下さい。

  • フォームで入力した値を別のフォームにコピーする

    はじめまして! javascriptでフォームAに入力した内容を ボタンが押されたら同一ページのフォームBに ペーストされるscriptを作りたいのですが そういったスクリプトを公開しているものがあれば 教えていただきたいです。よろしくお願いいたします。 やりたい事: [フォームA]---------------------  お名前:テキスト  性別:ラジオボタン  趣味:セレクトボックス  コメント:テキストエリア  [コピーボタン]←内容をコピーするボタン -------------------------------- ↓コピーボタンが押されたら↓ [フォームB]---------------------  お名前:テキスト  性別:ラジオボタン  趣味:セレクトボックス  コメント:テキストエリア -------------------------------- Aフォームに入力した内容Bフォームに反映される よろしくお願いいたします。

  • Access 複数フォームを開き、画面の最上面にしたいフォームをコント

    Access 複数フォームを開き、画面の最上面にしたいフォームをコントロールするコマンドを知りたい。 複数のフォームを開きます。 画面の最上面にしたいフォームをコントロールするコマンドは何を使えば良いのかご教授下さい。 Aのフォーム上で、Bのフォームを開くボタンを押す。 Bのフォームが開かれAのフォームの上に表示される。 Bのフォーム上の、切替ボタンを押すとAのフォームが上に表示させたい。 Bのフォームは、開くのに時間がかかる為閉じたくないのです。 Forms!A.SetFocusを記述したのですが変化なし Forms!A.Activateを記述でエラー! お願いします。

  • VB6でMDIフォームを使用しています。

    VB6でMDIフォームを使用しています。 MDIフォームで下記プログラムを作成しました。 (1)ツールバー上のボタン1を押し、子フォームAを表示させました。   ※子フォームAの WindowState を「2-最大化」に事前設定し、ウィンドウは最大化して表示されました。 (2)子フォームAを表示した状態で、同じツールバー上にあるボタン2を押し、子フォームB(ダイアログ)を表示させました。   ※子フォームBの WindowState を「0-標準」、BorderStyleを「3-固定ダイアログ」に事前設定し、表示されました。(一般的なオプション画面みたいなもの) 問題点はその際、子フォームAのウィンドウが勝手に「最大化」から「標準」に変わってしまうことです。 これを回避する方法はないのでしょうか? 以上、宜しくお願いいたします。

  • VB.NETで配列型のコントロールのセットのしかた?

    VB.NETで配列型のコントロールのセットのしかたが判りません。 インスタンスを作って何とか・・・・というのがあり、やってみたら フォームの左上すみから、ボロボロと続けて出てきました。 座標をあとからセットするとか、もっと簡単な方法はありませんか。

  • [VB.NET]3つ以上のフォームを一つずつ表示し、最後のフォームを閉じた時に最初のフォーム以外のフォームを閉じる

    VB.NETを学んでいるのですが、現在3つ以上のフォームを表示していくものを作ろうとして躓いたことがあったのでこちらに書き込みました。 内容としては、ボタンを押して次のフォームを表示していくものです。 動作の流れは以下のように考えています(フォームはA、B、Cの3つとする) 1.Aを表示 2.Aでボタンを押してBを表示し、Aは隠す 3.Bでボタンを押してCを表示し、Bは隠す 4.Cでボタンを押してBとCを閉じ、隠していたAを表示 隠すのはHideを用いてできたのですが、4.でCのボタンでBとCを一緒に閉じてAを表示させる方法がわかりませんでした。 1~4のように動作させるにはどうすればいいか教えてください

専門家に質問してみよう