C#のDataGridViewとデータバインドで躓いてしまいました。
ご教授願えたらと思います。
現在、DataGlidView2つを使ってUIを作っています。
こんな感じで、「名前を入れるGridView」と「その子がある年齢の時の身長と体重を入れるGridView」を使います。
環境:Window10 + Visual Studio 2015(できれば、VS2013でも動かしたい)
※タブとかbutton2とかは気にしないでください。勉強の残骸です。
###理想イメージ
上部のGridViewをセル選択した場合、該当するデータ群を下部のGridViewに表示したい。
操作的にいうと、上部から人の名前を選択すると、その人のある年齢時の身長体重が表示されるようにしたいのです。
###困ったこと データバインドのクラス設計(?)について
可変データでない場合のデータバインドの経験を流用しようと思いました。
C#
1public class DgvData 2{ 3 public DgvData() 4 { 5 this.name = "名前"; 6 } 7 public string name { get; set; } 8 public string address{ get; set; } 9}
このように、一つのデータクラスに複数のデータを持たせます。
そして、BindingDataクラスをドラッグしてきて、DataGridView.DataSourceに紐づける。
列とかいろいろ設定する。
FormでそのデータクラスのListを作り、DataGridView.DataSoureにインスタンスを渡す。
こうすれば、上部で選択した名前と同じインスタンスの住所にパッと切り替えられた経験があります。
※その時は下部にTextBoxを使っていました。
この経験を生かそうと思い、実装を始めたのですが、行き詰ってしまいました。
まずは、実装したデータクラスです。
C#
1namespace WinFormApp 2{ 3 public class SubData 4 { 5 public SubData() 6 { 7 this.age = 20; 8 this.height = 0; 9 this.weight = 0; 10 } 11 public int? age { get; set; } 12 public int height { get; set; } 13 public int weight { get; set; } 14 } 15 16 public class DgvData 17 { 18 public DgvData() 19 { 20 this.name = "名前"; 21 this.sub_data_list = new BindingList<SubData>(); 22 } 23 public BindingList<SubData> sub_data_list; 24 public string name { get; set; } 25 } 26}
単純に、上部GridViewのデータクラスに下部GridViewに表示するデータクラスを持たせてみました。
しかし、これではバインドの時に困りました。
C#
1namespace WinFormApp 2{ 3 public partial class Form1 : Form 4 { 5 private BindingList<DgvData> dgv_data = new BindingList<DgvData>(); 6 public Form1() 7 { 8 InitializeComponent(); 9 } 10 11 private void Form1_Load( object sender, EventArgs e ) 12 { 13 DgvBinder.DataSource = this.dgv_data; 14 DgvSubBinder.DataSource = this.dgv_data //...これ書かれへんのとちゃうか? 15 } 16 } 17}
BindingListクラスで上部GridViewにバインドするので、下部のデータは、まぁ書けませんでした。
###で、こうしました
C#
1namespace WinFormApp 2{ 3 public partial class Form1 : Form 4 { 5 private BindingList<DgvData> dgv_data = new BindingList<DgvData>(); 6 private BindingList<BindingList<SubData>> dgv_sub_data = new BindingList<BindingList<SubData>>(); 7 public Form1() 8 { 9 InitializeComponent(); 10 } 11 12 private void Form1_Load( object sender, EventArgs e ) 13 { 14 DgvBinder.DataSource = this.dgv_data; 15 DgvSubBinder.DataSource = this.dgv_sub_data; 16 } 17 } 18}
BindingList<SubData>を型に持つtemplate(?)コンテナ、BindingList<BindingList<SubData>をバインドしてやろう!
※たぶん、頭の中は考えなしです。分からなくなって、とりあえず、思いついた方法を試しています。
はい、上部GridViewのセルを選択したからと言って下部GridViewが変わることもなく、どうしたらいいのかと迷っています。
###回答について
こうじゃないの?っていうソースコードでも、アドバイスでも何でも構いません。
解決できる方法をご教授願えないでしょうか?
よろしくお願いいたします。

回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/01 15:38