###最初に
お世話になります。
コントロールに配列の各要素をBindingしたいのですが、
思ったよりも想定したコードが書けず悩んでしまったため力をお借りしたいです。
###試したこと
以下のようなプロパティを持つクラスを定義しました。
C#
1public class Hoge{ 2 public string Str { get; set; } 3 public string[] Strs { get; set; } = new string[8]; 4}
Str
については次のような実装でBinding
できます。
C#
1var hoge = new Hoge(); 2var property = hoge.GetType().GetProperty("Str"); 3 4var textBox = new TextBox(); 5textBox.DataBindings.Add(new Binding(nameof(textBox.Text),hoge,property.Name)); 6Controls.Add(textBox);
Strs
については以下のようなコードを書きました。
当然、property.Name
を示す型(string[]
)とhoge.Strs[3]
の型(string
)が違うと怒られ、うまく動作しません。
C#
1var hoge = new Hoge(); 2var property = hoge.GetType().GetProperty("Strs"); 3 4var textBox = new TextBox(); 5textBox.DataBindings.Add(new Binding(nameof(textBox.Text),hoge,property.Name)); 6Controls.Add(textBox);
次のようなクラスを定義し、Strs
の型をStringWrapper
型の配列に定義しなおしました。
C#
1public class StringWrapper{ 2 string Str { get; set; } 3} 4 5public class Hoge{ 6 string Str { get; set; } 7 StringWrapper[] Strs { get; set; } = new StringWrapper[8]; 8}
新しく定義しなおしたHoge
を次のようにBinding
をすれば動作しました。
C#
1var hoge = new Hoge(); 2 3foreach(var property in hoge.strs.GetType().GetProperties()){ 4 var textBox = new TextBox(); 5 textBox.DataBindings.Add(new Binding(nameof(textBox.Text),hoge,property.Name)); 6 Controls.Add(textBox); 7}
###知りたいこと
StringWrapper
を介さずに配列の要素をBinding
できる方法はありませんでしょうか。
何か思いつきがありましたら、是非ご教授をお願いいたします。
2019/03/06 ミニマムコードを作りました
VS2017のWindowsフォームアプリから生成されたForm1.csに対して次のようなコードを記載しました。
下記の書き方だとBindingされるのは配列の要素ではなく配列自体がBindingされてしまいます。
C#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10 11namespace BindingArray 12{ 13 public partial class Form1 : Form 14 { 15 private Hoge hoge = new Hoge(); 16 17 public Form1() 18 { 19 InitializeComponent(); 20 21 hoge.Str = "hoge"; 22 hoge.Strs.Add("aaa"); 23 var property = hoge.GetType().GetProperty("Strs"); 24 25 var textBox = new TextBox(); 26 //第3引数の文字列にproperty.Name+"[0]"とズルい書き方をしてもNGでした 27 textBox.DataBindings.Add(new Binding(nameof(textBox.Text), hoge, property.Name)); 28 Controls.Add(textBox); 29 } 30 } 31 public class Hoge 32 { 33 public string Str { get; set; } 34 35 public BindingList<string> Strs { get; set; } = new BindingList<string>(); 36 } 37} 38
あなたの回答
tips
プレビュー