C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: [C#] List化された構造体のコピー


(過去ログ 101 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■60192 / inTopicNo.1)  [C#] List化された構造体のコピー
  
□投稿者/ junjun (1回)-(2011/06/22(Wed) 21:37:00)

分類:[C#] 

■環境
 開発環境:WindowsXP(XP3)
 使用言語:Visual C#(VS2005)

はじめまして

C#でですが、、、
List化された構造体情報を、Form1 → Form2への値受け渡しがしたいのですが
うまく出来ないです。

    public partial class Form1 : Form
    {
        struct AAA
        {
            public a;
        }

        List<AAA> aaa = new List<AAA>();

このaaaを別Formへ値渡しをしたいです。
いい方法はないのでしょうか?
一個一個渡すしかない?

良い方法があれば教えてください。

引用返信 編集キー/
■60195 / inTopicNo.2)  Re[1]: [C#] List化された構造体のコピー
□投稿者/ επιστημη (2640回)-(2011/06/22(Wed) 22:18:16)
επιστημη さんの Web サイト
using System;
using System.Collections.Generic;

class They {
  public struct AAA {
    public int value;
  }
  private List<AAA> container;
  public They() {
    container = new List<AAA>();
    for ( int i = 0; i < 10; ++i ) {
      AAA item = new AAA();
      item.value = i;
      container.Add(item);
    }
  }
  public List<AAA> getValues() {
    return new List<AAA>(container); // ←やりたかったのはコレ?
  }
  public void printValues() {
    foreach ( AAA item in container ) {
      Console.Write("{0} ", item.value);
    }
    Console.WriteLine();
  }
}

class We {
  private List<They.AAA> container;
  public We(They t) {
    // Theyからもらって
    container = t.getValues();
    // 確認のためいくつか書き換え
    for ( int i = 0; i < container.Count; i += 2 ) {
      They.AAA item = new They.AAA();
      item.value = -i;
      container[i] = item;
    }
  }
  public void printValues() {
    foreach ( They.AAA item in container ) {
      Console.Write("{0} ", item.value);
    }
    Console.WriteLine();
  }

  public static void Main() {
    They t = new They();
    We   w = new We(t);
    t.printValues();
    w.printValues();
  }
}

引用返信 編集キー/
■60196 / inTopicNo.3)  Re[2]: [C#] List化された構造体のコピー
□投稿者/ 逆運の覇者 (10回)-(2011/06/22(Wed) 22:26:54)
επιστημηさん、よく書きますね。
私ならそこまで書こうとは思わないです。



ややはしょって書きましたが、こういうことでしょう。

    public partial class Form1 : Form
    {
        private List<AAA> aaa;

        private void Form1_Load(object sender, EventArgs e)
        {
            private List<AAA> aaa = new List<AAA>();
        }

        public List<AAA> GetAAA()
        {
            return this.aaa;
        }
    }

    public partial class Form2 : Form
    {
        Form1 f = new Form1();
        List<AAA> aaa = f.GetAAA();
        f.Dispose();
    }

引用返信 編集キー/
■60198 / inTopicNo.4)  Re[3]: [C#] List化された構造体のコピー
□投稿者/ επιστημη (2641回)-(2011/06/22(Wed) 22:45:48)
επιστημη さんの Web サイト
>         public List<AAA> GetAAA()
>         {
>             return this.aaa;
>         }

え? これでいいいの? 
「別Formへ"値渡し"をしたいです」とあったのでコピーを作ったんだけども...

引用返信 編集キー/
■60201 / inTopicNo.5)  Re[3]: [C#] List化された構造体のコピー
□投稿者/ Azulean (769回)-(2011/06/22(Wed) 23:28:05)
No60196 (逆運の覇者 さん) に返信
> public partial class Form2 : Form
> {
> Form1 f = new Form1();
> List<AAA> aaa = f.GetAAA();
> f.Dispose();
> }

はしょっているせいでおかしくなっているのかもしれませんが、これでは Form1 → Form2 の値渡しというよりは、Form2 が Form1 を一時的に作って取っているだけですよね。

元の質問には書かれていませんが、Form1 が Form2 を表示し、その際に List を引き渡したいというよくある話であれば、このサンプルでは不適当になりかねません。
また、new して値をとって捨てるだけなら、おそらく渡したい値は List に入っていないのではないでしょうか。
# Load イベントって new しただけじゃこなかった記憶もありますが、未確認。
引用返信 編集キー/
■60203 / inTopicNo.6)  Re[4]: [C#] List化された構造体のコピー
□投稿者/ 逆運の覇者 (11回)-(2011/06/22(Wed) 23:55:39)
> これでは Form1 → Form2 の値渡しというよりは、Form2 が Form1 を一時的に作って取っているだけですよね。
Form1がすぐ消えるじゃないかと言われればそのとおりですが、
私はログイン用のフォームとかプリンタ選択用フォームでこういうことをやっていますよ。
メインフォームからログインフォームの生成、呼び出し⇒ログインフォームから必要なデータを取る⇒ログインフォームをDispose()。

> また、new して値をとって捨てるだけなら、おそらく渡したい値は List に入っていないのではないでしょうか。
まあ、サンプルなんで…。

> # Load イベントって new しただけじゃこなかった記憶もありますが、未確認。
そりゃそうですね。ShowDialog()とかすれば起きるでしょうけど。
引用返信 編集キー/
■60214 / inTopicNo.7)  Re[5]: [C#] List化された構造体のコピー
□投稿者/ junjun (2回)-(2011/06/23(Thu) 06:10:12)
επιστημη さん
逆運の覇者 さん
Azulean さん

皆様回答ありがとうございます。
僕の言葉足らずな意図を組んでもらったり、、、ほんとすみません><



僕としては、Azulean さんがおっしゃるとおり
 「Form1で取得した 「List<AAA> aaa = new List<AAA>();」で宣言した構造体ListデータをForm2で使えるようにしたい」
を実現したいと思っています。


逆運の覇者 さんがコメントしてくれたやり方では、すでにLoadしているForm1との
紐付けができるのかな?
ちょっと僕にはやりかたがよくわかりませんでした(スミマセン、、無知で><)


いろいろと考えたのですが、、、、
Form2での変数宣言をするときに、Form1で宣言されているpublic struct AAAで
宣言して、AddRangeでAddしたら、それっぽい動きをしました。
(επιστημηさんのコメント参考にしてみました)

*Form1
   public struct AAA
   {
       public int a;
   }

   public List<AAA>aaa = new List<AAA>();

   private void button1_Click(object sender, EventArgs e)
   {
     Form2 f = new Form2();
     f.aaa.AddRange(aaa);
       f.ShowDialog();
       f.Dispose();
   }


*Form2
   public List<Form1.AAA> aaa = new List<Form1.AAA>();

   private void button1_Click(object sender, EventArgs e)
   {
       for(int i = 0;i < aaa.Count;i++){
           Debug.Write(aaa[i].a);
       }
   }


このやり方は正しいやり方なのでしょうか?
(Form1の構造体をForm2で使うってのが、もやもやします、、、、><)

それとも、構造体をPublicで宣言する場合には決められた(一般的な)方法が
あるのでしょうか?

質問ばかりで申し訳ないです。
協力をよろしくお願いします。

引用返信 編集キー/
■60218 / inTopicNo.8)  Re[6]: [C#] List化された構造体のコピー
□投稿者/ 逆運の覇者 (12回)-(2011/06/23(Thu) 09:35:59)
>(Form1の構造体をForm2で使うってのが、もやもやします、、、、><)
構造体AAAをForm1の中で定義しているのでそうなります。
なので、クラスの中から追い出します。
↓のソースでコンパイル・実行してみました。


Form2.cs
----------------------------------------------
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 Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
            
            Form1 f1 = new Form1();
            
            List<AAA> bbb = f1.AAAList;

            foreach (AAA b in bbb)
            {
                MessageBox.Show(b.a.ToString());
            }
        }


    }
}


Form1.cs
------------------------------------------
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 struct AAA
    {
        public int a;
    }

    public partial class Form1 : Form
    {
        public List<AAA> AAAList;

        public Form1()
        {
            InitializeComponent();

            AAAList = new List<AAA>();

            AAA aaa = new AAA();

            aaa.a = 100;
            AAAList.Add(aaa);
            aaa.a = 101;
            AAAList.Add(aaa);
            aaa.a = 102;
            AAAList.Add(aaa);
        }

        public List<AAA> GetAAA()
        {
            return this.AAAList;
        }

    }
}


Program.cs
-----------------------------------
using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WindowsApplication1
{
    static class Program
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            //Form1ではなく、Form2にしてます。
            Application.Run(new Form2());
        }
    }
}

引用返信 編集キー/
■60233 / inTopicNo.9)  Re[6]: [C#] List化された構造体のコピー
□投稿者/ shu (803回)-(2011/06/23(Thu) 12:30:41)
No60214 (junjun さん) に返信

> それとも、構造体をPublicで宣言する場合には決められた(一般的な)方法が
> あるのでしょうか?
どこで使用する構造体なのかということだと思います。Form1で主に使用する構造体であれば
Form1で定義でいいでしょうし、Form2でも同じ位使うのなら、Form1でもForm2でもなく両方から
対等にアクセスできる場所に定義すると良いと思います。構造体定義用のファイルを用意しても
よいかもしれません。

引用返信 編集キー/
■60238 / inTopicNo.10)  Re[7]: [C#] List化された構造体のコピー
□投稿者/ junjun (3回)-(2011/06/23(Thu) 14:16:48)
επιστημη さん
逆運の覇者 さん
Azulean さん
shu さん

協力ありがとうございました。

C#はまだ覚え始めたくらいなので、、、、、
知識ベースがVBなので、戸惑いながらプログラミング勉強しています。

 逆運の覇者 さん
  Form1 Classの外(namespace の下)がPublicな部分になるんですね。
  どうしてもForm2とファイルが分かれているので、もやもやしちゃいましたが、
  よく見れば、同じnamespace 内になっているってことですね。
  勉強になります。

 shu さん
  VBの時には「Module」というくくりが出来たので、そこにPublic的な関数や変数を定義していました。
  C#だと、勝手がわからなく、Classの下にあるべきと思い今回の質問をしてしまいました。
  よくよく考えれば、わざわざForm1の情報をForm2に渡すなんてまどろっこしいことしなくてよかった><
  参照渡しであれば、また違うと思いますが、、、、
  

   >構造体定義用のファイルを用意してもよいかもしれません。

  これにチャレンジしてみますね。


回答くださった皆様、協力ありがとうございました。

また、何かあれば、、、、よろしくお願いしたいと思います。。。。
  
  
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -