|
2019/08/29(Thu) 10:39:46 編集(投稿者)
■No92132 (河童 さん) に返信 > public static List<infoCSVLst> InfoCSVLst = new List<infoCSVLst>(); > public static List<dgvCSVLst> DgbCSVLst = new List<dgvCSVLst>(); > private void button1_Click(object sender, EventArgs e) > { > Create_DataSource("1課", "1班"); > dataGridView1.DataSource = DgbCSVLst; > }
こういったケースでは、 DgvCSVList = Create_DataSource("1課", "1班"); dataGridView1.DataSource = DgbCSVLst; あるいは DgvCSVList = Create_DataSource(InfoCSVLst, "1課", "1班"); dataGridView1.DataSource = DgbCSVLst; のようにして、メソッドの戻り値として抽出結果を返すようにした方が 処理の影響範囲が分かりやすくなりそうです。
> public class infoCSVLst > public class dgvCSVLst
この 2 つは、何が違うのでしょうか?
メンバー構成に差異が無いのなら、後者の dgvCsvLst 型は使わず、 DgbCSVLst を List<dgvCSVLst> 型から List<infoCSVLst> 型に 変更しておくことで、 > //(不明点) > List<string> data = query.Select(d => d.group_id).ToList(); の部分を DgbCSVLst = query.ToList(); だけで済ませられるようになりますよ。
もしも DgbCSVLst の型を List<dgvCSVLst> のままにしたいのであれば、 // List<string> data = query.Select(d => d.group_id).ToList(); DgbCSVLst = query.Select(d => new dgvCSVLst { group_id = d.group_id, han_id = d.han_id, staff_name = d.staff_name, }).ToList(); のようにして、dgvCSVLst の各メンバーを指定してやれば OK です。
上記では、フィールド変数 DgbCSVLst が指し示すオブジェクトが、 .ToList() で生成されたインスタンスに指し換わることになりますので、 実際の抽出メソッドにおいては、 return query.Select(d => new ……).ToList(); のように戻り値で返すようにし、呼び出し側の button1_Click で DgvCSVList = Create_DataSource("1課", "1班"); のように受け取ることをお奨めしておきます。この書き方だと、 button1_Click の部分を見るだけで、DgvCSVList のインスタンスが 変更されるという事を明確にできるため、分かりやすくなります。
もちろん、抽出メソッドの定義は現状どおり void のままとし、 戻り値として返すのではなく、フィールド変数を更新する形として 実装しても構いません。ただしその場合、 (a案) 抽出のたびに DgvCSVList のインスタンスを作り直す (b案) DgvCSVList のインスタンスは維持し、中身だけを差し替える のいずれの実装とするのかを考える必要がありますね。
ただし a 案とする場合は、戻り値として返却させた方が 望ましいのは先述の通りですし、b 案もあまりお奨めしません。
b案の場合は、 // 既存インスタンスの中身をクリア DgbCSVLst.Clear(); // 抽出結果を詰めなおす DgbCSVLst.AddRange(query.Select(d => new dgvCSVLst { group_id = d.group_id, han_id = d.han_id, staff_name = d.staff_name, })); のように書けるわけですが、List<dgvCSVLst> は変更通知機能を 持っていないため、DataGridView との相性が良く無いためです。
このような使い方をしたいなら、DataTable を用いた方が良いでしょう。 DataTable は更新通知機能を持っているため、 DataGridView 等とのバインド時の相性が良いためです。
> public static List<infoCSVLst> InfoCSVLst = new List<infoCSVLst>(); > public static List<dgvCSVLst> DgbCSVLst = new List<dgvCSVLst>();
これらを static にするべきではありません。 そもそも、静的メンバーをインスタンスメソッドから更新するのは不自然です。
たとえば、Form1 (あるいは別フォームでも良い)などに private void button2_Click(object sender, EventArgs e) { var f1 = new Form1(); var f2 = new Form1(); var f3 = new Form1(); f1.Show(); f2.Show(); f3.Show(); } などとすれば、Form1 クラスのインスタンスを 3 つ作成し、 同時に表示することも出来るわけです。(普段そんなことはしないと思いますが)
この場合、それぞれのフォームごとに DataGridView があるわけですが、 その場合の結果としては、 (案1) どの Form1 からも、同じ一覧が表示されている (案2) それぞれの Form1 で、それぞれの抽出結果が表示されている のいずれかになるのが普通です。(案2 にすることが多いかな?)
しかし今はそのどちらにもなりません。
static な静的メンバーを、それぞれの Form1 インスタンスの Load から .Add しあっているため、上記 button2 を押したときに、 一つの List<T> インスタンスに、データが三重に追加されることになります。
案2 とするならば、静的ではなくインタンスのメンバーが望ましいので、 public static List<T> を private static List<T> とすべきです。
案1 とするならば、List<T> は Form1.cs の public static フィールドとして 用意するのではなく、Program.cs あたりで管理された方が良いでしょう。
ただし案1 の場合は、List<T> への排他制御も考慮する必要があります。 (Add し終わるまで、他の場所で読み書きできないことを保証すべき)
|