質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Q&A

解決済

1回答

2174閲覧

データの受け渡しについて

AEGIL

総合スコア7

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

0グッド

0クリップ

投稿2020/12/24 04:34

編集2020/12/24 09:15

前提
リンク内容
こちらの質問の内容について追加で疑問点が出たのでスレッドを再度上げさせていただきます。

質問内容
下記のコード
{1}ResultDT内に結合後のデータ格納用のクラス
{2}ResultDTはOracleDTとCsvDTをinnnerjoinで結合しています。
string[] names = innnerjoin.Select(r => r.名前).Distinct().ToArray();以降の文で
結合結果の内容編集する(名前が連続したとき枝番を作成するというもの)
処理をしているのですが、現状のコードだとDataGridViewにinnnerjoinを入れてしまっているので
DataGridViewに表示しようとした際に編集前のデータが出力されてしまいます。
データの受け渡しの流れが理解できていないのでどうしたらDataGridViewに編集後の値が反映された状態でResultDT内のすべての要素を含んだ表を表示することができるのでしょうか?

c#

1public class OracleDT 2 { 3   //格納先 4 public string name{ get; set; } 5 public int count{ get; set; } 6 public string code{ get; set; } 7 } 8 public class CsvDT 9 { 10   //格納先 11 public string name{ get; set; } 12 public int count{ get; set; } 13 public string code{ get; set; } 14 } 15 public class ResultDT 16 { 17   //格納先 18 public int NO{ get; set; } 19 public string 名前{ get; set; } 20 public int 枝番号{ get; set; } 21 public string 商品{get;set;} 22 public string 商品備考{get;set;}//空の列なので値は入れない 23 } 24prrotected void Button(object sender ) 25 List<OracleDT> oracleDTs = createOracleList(); 26 List<CsvDT> csvDTs = createCsvList(); 27 28 var innnerjoin = from c in csvDTs 29 join o in oracleDTs 30 on c.code equals o.code 31 select new ResultDT 32 { 33 NO= i++, 34 名前 = c.Name, 35 枝番号 = 1, 36 商品 = o.SName 37 } 38 39       string[] names = innnerjoin.Select(r => r.名前).Distinct().ToArray(); 40 foreach (string name in names) 41 { 42 List<ResultDT> resultsN = innnerjoin.Where(r => r.名前 == name).ToList(); 43 int i = 1; 44 foreach (ResultDT result in resultsN) 45 { 46 result.枝番号 = i++; 47 console.writeline(result.枝番号); 48 } 49 } 50       //ソース作成 51 BindingSource source = new BindingSource(); 52 //ソースにinnnerjoin内のデータ挿入 53 source.DataSource=innnerjoin; 54 //DataGridViewにデータを挿入 55 dataGridView1.DataSource = source;

追記
上記のコード実行時に表示されるDataGridViewの内容
source.DataSource=innnerjoin;

No,名前,枝番,商品,商品備考 1,satou,1,コーラ, 2,satou,1,ソーダ, 3,kagaya,1,リンゴ, 4,gotou,1,コーラ, 5,gotou,1,スイカ, 6,gotou,1,メロン,

実現したいDataGridViewの内容

No,名前,枝番,商品,商品備考 1,satou,1,コーラ, 2,satou,2,ソーダ, 3,kagaya,1,リンゴ, 4,gotou,1,コーラ, 5,gotou,2,スイカ, 6,gotou,3,メロン,

動いているが枝番号が反映されていない

  string[] names = innnerjoin.Select(r => r.名前).Distinct().ToArray();//2 枝番の編集箇所 foreach (string name in names)//name=satou names=名前列全件データ { List<ResultDT> resultsN = innnerjoin.Where(r => r.名前 == name).ToList(); int i = 1; foreach (ResultDT result in resultsN) { result.枝番号 = i++; console.writeline(result.枝番号); } }

一緒になっている箇所

     >>枝番号を書き換える前の innnerjoin のことですか?     var innnerjoin  = from c in csvDTs//1 枝番変更前 join o in oracleDTs on c.code equals o.code          //ソース作成 BindingSource source = new BindingSource(); //ソースにinnnerjoin内のデータ挿入 source.DataSource=innnerjoin; //3 ここで1を呼び出している? //DataGridViewにデータを挿入 dataGridView1.DataSource = source;

訂正前の文
下記のコードだと
public class ResultDT>innnerjoin=oracleDTs+csvDTsということだと思っていて
var innerjoin=... select new ResultDT{}内にデータがあるときその上に属してるResultDT内のstring {get; set;}に値が入り select new ResultDT{}内に該当するものがないときResultDT内のstring {get; set;}は空データの列になる解釈でした。
ResultDTという箱(public class ResultDT)にDataを入れるための小さい箱(public string {get; set;})があるとしてinnnerjoinはResultDT内の小さい箱の名前と一致するデータを各要素(小さい箱)にいれているイメージでした。なので小さい箱はあってもinnerjoinでデータを渡していない場合は小さい箱は用意されているが値が入っていないのでDataGridViewで表示した際に空の列が作成される想定をしていたのですが現状の書き方(DataGridView=innnerjoin)だと
string[] names = innnerjoin.Select...の編集内容はDatagridViewでは繁栄されずに
select new ResultDTで入れた値のみが出ている状況になります。
DataGridViewに編集後のデータを入れるにあたってどうしたらいいのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/12/24 05:02 編集

> public class ResultDT>innnerjoin=oracleDTs+csvDTsということだと思っていて・・・ 前のスレッドでその辺りは意味不明だと言ったのに何も改善してもらえないのは残念。
ozwk

2020/12/24 05:11

> ResultDT>innnerjoin=oracleDTs+csvDTs 何言っているかわからないので記号ではなく日本語で説明をお願いします
AEGIL

2020/12/24 05:15

すみません文章力がないので時間がかかってしまいました。説明不足していましたらお伝えいただけると幸いです。
退会済みユーザー

退会済みユーザー

2020/12/24 05:23 編集

質問を書いたら読み直しましょう。誤字があったら直しましょう。ここに書いてないことは知り得ない第三者が読んで意味が伝わるか考えてみましょう。そこがまず最低線です。 依然として意味が分かりませんが、ユーザーが DataGridView の表示を見て編集した結果がデータソースの List<T> に反映されないのは何故かと聞いてます?
AEGIL

2020/12/24 05:36 編集

>>依然として意味が分かりませんが、ユーザーが DataGridView の表示を見て編集した結果がデータソースの List<T> に反映されないのは何故かと聞いてます? 誤字脱字申し訳ありません。 質問内容が string[] names = innnerjoin.Select(r => r.名前).Distinct().ToArray(); で以降で編集した内容のデータをDataGridViewで見るにはどうしたらいいのか  そしてイメージしていたことが連れている可能性があるのでその流れをお聞きしたいです。
退会済みユーザー

退会済みユーザー

2020/12/24 05:41

マルチポスト以前にも指摘したと思うんですけど、黙って削除する前に何かコメントはないのですか?
AEGIL

2020/12/24 05:57 編集

まず、先に削除したこと申し訳ありません。謝罪が優先でした。
退会済みユーザー

退会済みユーザー

2020/12/24 06:08 編集

謝罪は正直どうでもいいんですけど、何故以前指摘されたにも関わらず、何も考えずにマルチポストしてるのか甚だ疑問です。特に問題だと考えていないという事でしょうか。 > やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。 推奨はされてないですが禁止されてる訳ではないので、マルチポストしたなら、せめてやる事やってください。リンク先すら読む気がない、やりたいようにやるというのであれば、もはや何も言う事はないですが。
退会済みユーザー

退会済みユーザー

2020/12/24 06:12

質問を読み直して誤字があったら直しましょうと言ったのに依然として直ってない。 > 小さい箱は容易されている > 編集内容はDatagridViewでは繁栄されずに そういうことからちゃんとやりましょうよ。
AEGIL

2020/12/24 06:13

確かに理由の記述行っておりませんでした。 一旦リンク先を再度確認します。
AEGIL

2020/12/24 06:14

>質問を読み直して誤字があったら直しましょうと言ったのに依然として直ってない。 申し訳ありません今一度確認します。
退会済みユーザー

退会済みユーザー

2020/12/24 06:15

> string[] names = innnerjoin.Select(r => r.名前).Distinct().ToArray(); > で以降で編集した内容のデータをDataGridViewで見るにはどうしたらいいのか 質問に書いてあるコードの結果はどうなるのですか?  > そしてイメージしていたことが連れている可能性があるのでその流れをお聞きしたいです。 意味不明です。「連れている」とはどういう意味? そもそもあなたの「イメージ」はどこにも説明されてないので誰にも分かりません。
退会済みユーザー

退会済みユーザー

2020/12/24 06:18 編集

× 編集内容はDatagridViewでは繁栄されずに 〇 編集内容はDataGridViewでは反映されずに
AEGIL

2020/12/24 06:33

修正を致しました。ご確認お願い致します。
退会済みユーザー

退会済みユーザー

2020/12/24 06:44 編集

> 現状のコードだとDataGridViewにinnnerjoinを入れてしまっているので DataGridViewに表示しようとした際に編集前のデータが出力されてしまいます。 編集前のデータとは何ですか? 枝番号を書き換える前の innnerjoin のことですか? 質問のコードを見ると書き換えた後に、 BindingSource source = new BindingSource(); source.DataSource=innnerjoin; dataGridView1.DataSource = source; としているのに?????
AEGIL

2020/12/24 07:09 編集

編集前のデータはinnnerjoinのことになります。 質問は動かしているコードをコピペしたものなのですが、innnerjoinで出力すると枝番ではなく1がループされます。
退会済みユーザー

退会済みユーザー

2020/12/24 07:15

意味が分かりません。上の質問にストレートに答えてもらえませんか?
AEGIL

2020/12/24 07:25

>>編集前のデータとは何ですか? 枝番号を書き換える前の innnerjoin のことですか? innnerjoinのことになります。 >>質問のコードを見ると書き換えた後に......としているのに????? はい。上記の順番で処理を行っております。
退会済みユーザー

退会済みユーザー

2020/12/24 08:08

話が通じないですね・・・ > 枝番号を書き換える前の innnerjoin のことですか? Yes or No どっちですか?
AEGIL

2020/12/24 08:13

枝番号を変える前のinnnerjoinです。
退会済みユーザー

退会済みユーザー

2020/12/24 08:24

>> Yes or No どっちですか? > 枝番号を変える前のinnnerjoinです。 と >> 質問のコードを見ると書き換えた後に......としているのに????? > はい。上記の順番で処理を行っております。 は話が合わないけど? 「上記の順番」すなわち質問のコード順番ですよね。であれば「前」ではなく「後」に見えますけど。
AEGIL

2020/12/24 08:29 編集

>>>> 質問のコードを見ると書き換えた後に......としているのに????? yesになります
AEGIL

2020/12/24 08:30

一旦追記致します。
退会済みユーザー

退会済みユーザー

2020/12/24 08:31

ダメだ、話が通じない・・・
AEGIL

2020/12/24 09:18

追記のinnnerjoinの箇所に番号を振りました。 まず、話が理解できず申し訳ありません なぜか、innerjoinのコメント1番とコメント3番がイコールになってしまっています。 編集前のデータとはコメント1番のことを指しておりました
Zuishin

2020/12/24 10:46

枝番号があるのは resultsN ですが、なぜ枝番号の無い innnerjoin を DataSource に入れて枝番号が反映されるんでしょう?
退会済みユーザー

退会済みユーザー

2020/12/25 04:02

質問者さん、急に無言になってしまいましたが、回答したのでそれに対するフィードバックを回答のコメント欄に書いてください。役に立った/立たなかったぐらいはすぐに返せるのでは? 役に立たなかったならどこがダメだったが書いてもらえると、役に立つ回答が出せるかも。とにかく無言は NG です。
Zuishin

2020/12/25 05:47

返事をすると私に通知がいくからでしょう。入退会を繰り返すクズ質問者の手口です。
guest

回答1

0

ベストアンサー

依然として意味不明ですが、想像するに以下のようにしたいということ? 違うなら、断片的なコードではなくて、問題を再現するための必要最低限かつ完全なコードをアップしてください。あなたの言ってることはホントに分からない。

using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Windows.Forms; using System.ComponentModel; namespace WinFormsApp1 { public partial class Form12 : Form { private List<ResultDT> innerjoin; public Form12() { InitializeComponent(); this.dataGridView1.DataSource = this.bindingSource1; } private void Form12_Load(object sender, EventArgs e) { this.innerjoin = new List<ResultDT> { new ResultDT { No = 1, 名前 = "satou", 枝番号 = 1 }, new ResultDT { No = 2, 名前 = "satou", 枝番号 = 1 }, new ResultDT { No = 3, 名前 = "kagaya", 枝番号 = 1 }, new ResultDT { No = 4, 名前 = "gotou", 枝番号 = 1 }, new ResultDT { No = 5, 名前 = "gotou", 枝番号 = 1 }, new ResultDT { No = 6, 名前 = "gotou", 枝番号 = 1 } }; this.bindingSource1.DataSource = this.innerjoin; } private void button1_Click(object sender, EventArgs e) { string[] names = innerjoin.Select(r => r.名前).Distinct().ToArray(); foreach (string name in names) { List<ResultDT> resultsByName = innerjoin.Where(r => r.名前 == name).ToList(); int i = 1; foreach (ResultDT result in resultsByName) { result.枝番号 = i++; } } this.bindingSource1.DataSource = null; this.bindingSource1.DataSource = this.innerjoin; } } public class ResultDT { public int No { get; set; } public string 名前 { get; set; } public int 枝番号 { get; set; } } }

初期画面

イメージ説明

Button1 クリック

イメージ説明

【追記】

上の button1_Click ハンドラのコードの中で、DataGridView に innerjoin のデータをリロードするため、BindingSource.DataSource に null を設定して、再度 innerjoin を設定してます。巷でよく目にする方法ですが、それに代えて BindingSource.ResetBindings メソッドを使った方が良さそうです。

Microsoft のドキュメントによると "ResetBindings は、他のメンバがデータ バインディングに対して大幅な変更を加えたときに、自動的に呼び出されます。たとえば、DataSource プロパティや DataMember プロパティが設定された場合などです。ただし、プログラム上でこのメソッドを明示的に呼び出すこともできます" とのことですので、BindingSource.DataSource に null を設定して再度 innerjoin を設定したときに ResetBindings メソッドが呼び出されていると思われます。

投稿2020/12/24 10:45

編集2020/12/25 01:26
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AEGIL

2020/12/25 05:33

ご回答ありがとうございます。 只今下校致しました。連絡おそくなってしまい申し訳ありません。 本日上記の内容参考にして動作確認できました。     var innnerjoin  = from c in csvDTs//1 枝番変更前 join o in oracleDTs on c.code equals o.code で結合する前に List<CsvDT> csvDTs = createCsvList(); の内部で枝番編集を行うことで結合時点で枝番号を入れた状態にすることでスムーズに結果を出力することができました。 文章誤字脱字や説明不足色々至らない箇所あったかと思いますがご返答いただきありがとうございました。連日本当にもうしわけございませんでした。
退会済みユーザー

退会済みユーザー

2020/12/25 06:53

あなたの問題・課題が何だったのか未だに分かりません。 もし次回質問することがあったら、先に私が質問のコメント欄で言った「質問を書いたら読み直しましょう。誤字があったら直しましょう。ここに書いてないことは知り得ない第三者が読んで意味が伝わるか考えてみましょう。そこがまず最低線です」を思い出してもらえると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問