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

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

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

Re[3]: DataGridViewに配列用の列を追加したい


(過去ログ 168 を表示中)

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

■97354 / inTopicNo.1)  DataGridViewに配列用の列を追加したい
  
□投稿者/ くろこ (1回)-(2021/04/29(Thu) 14:13:08)

分類:[.NET 全般] 

DataGridViewのAutoGenerateColumnsをtrueにした状態で DataSourceにBindingList<MyClass>を設定しています。
通常のMyClassメンバは問題なく登録できているのですが、配列プロパティについては列として表示されずに困っています。
確かに要素数が確定していない状態で列を登録するのは難しいのかなという気もしていますが、もし何か良い対応方法があれば教えていただきたいです。

以下、関連する処理の抜粋と私の試してみたことです。
試したことの3番で一応列に配列のゼロ番目の要素を表示することはできたのですが、
要素最大数を確定しておかなければならないこと、要素最大数分のプロパティを定義する手間があることに引っかかっています。
こういう力技でなく、もっとスマートな対応があるのではないかとこちらに問い合わせさせていただく次第です。

<関連する処理抜粋>
    // クラス定義
	class MyClass
	{
		public string Name{ get; set; } // このプロパティは問題なく列に表示される
		public string[] StringParam{ get; set; } // このプロパティは表示されない
	}

    // DataSource設定
	BindingList<MyClass> _MyClassList = new BindingList<MyClass>();

	dataGridView1.AutoGenerateColumns = true;
	dataGridView1.DataSource = _MyClassList;

<StringParamについて試したこと>

1.宣言時にnewで要素数を確定させてみた→表示されず
 public string[] StringParam{ get; set; } = new string[3];

2.List<string>にしてみた→表示されず
 public List<string> StringParam{ get; set; } = new List<string>();

3.要素ごとにプロパティを定義した→表示される
	public string StringParam0 {
		get  {
			if (StringParam.Count > 0) {
				return StringParam[0];
			}
			return string.Empty;
		}
		set {
			if (StringParam.Count > 0) {
				StringParam[0] = value;
			}
		}
	}

以上、よろしくお願いいたします。

引用返信 編集キー/
■97355 / inTopicNo.2)  Re[1]: DataGridViewに配列用の列を追加したい
□投稿者/ WebSurfer (2232回)-(2021/04/29(Thu) 15:05:46)
No97354 (くろこ さん) に返信

DataGridView に MyClass のデータを表示する際は string[] StringParam の配列は
カンマ区切りの文字列にしてそれを表示というようなことはナシですか?
引用返信 編集キー/
■97359 / inTopicNo.3)  Re[2]: DataGridViewに配列用の列を追加したい
□投稿者/ くろこ (2回)-(2021/04/29(Thu) 19:39:36)
No97355 (WebSurfer さん) に返信
> ■No97354 (くろこ さん) に返信
>
> DataGridView に MyClass のデータを表示する際は string[] StringParam の配列は
> カンマ区切りの文字列にしてそれを表示というようなことはナシですか?

ご提案ありがとうございます。
なるほど、確かにそれだとすべての要素を表に乗せることは可能ですね。
もしどうしても列としての定義が無理そうでしたら
ご提案いただいたカンマ区切りで1セルに記載する方法か、こちらで試した3番の方法かの2択で対応を検討することになりそうです。
ほかに方法がないものか、もう少し回答を受け付けてみます…。
引用返信 編集キー/
■97360 / inTopicNo.4)  Re[3]: DataGridViewに配列用の列を追加したい
□投稿者/ Hongliang (1166回)-(2021/04/29(Thu) 19:55:43)
AutoGenerateColumnsで生成される列は、配列やList<T>などIListを実装する型のプロパティについてはDataGridViewImageColumnしか対応しません。
// さらにそのプロパティが画像に変換できるものであることも要求されます。

必要であれば、AutoGenerateColumnsで生成される列とは別に、自前で追加する必要があります。
とはいえ、そもそもコレクション型のプロパティをどう表示すればいいのかという話になるかとおもいます。
標準ライブラリに存在するDataGridViewColumn派生クラスでは対応できないのではないでしょうか。DataGridViewComboBoxColumnはコレクションの中から1つ選ぶ列の型ですし。

あれ、ひょっとして例えば要素数3の配列があったとき、それが3列に展開されることを期待されていますか?
引用返信 編集キー/
■97361 / inTopicNo.5)  Re[4]: DataGridViewに配列用の列を追加したい
□投稿者/ くろこ (3回)-(2021/04/29(Thu) 23:10:26)
No97360 (Hongliang さん) に返信

> あれ、ひょっとして例えば要素数3の配列があったとき、それが3列に展開されることを期待されていますか?

はい、それを期待しています。
やはり無理なお話でしょうか?
引用返信 編集キー/
■97362 / inTopicNo.6)  Re[5]: DataGridViewに配列用の列を追加したい
□投稿者/ Hongliang (1167回)-(2021/04/30(Fri) 08:57:31)
不可能ではないですが、リフレクションの知識がいくらか必要になります。
自分でDataGridViewColumnを追加していったほうがかえって簡単かもしれません。

BindingList<MyClass>を派生させたクラスMyClassBindingListにITypedListを実装させ、そのGetItemPropertiesにて、自分の最初の要素(全部の要素を見てStringParamの要素数が一番少ない奴、とかでもいいですが)をもとに、StringParamを複数のPropertyDescriptorにします。

PropertyDescriptorの派生クラスも用意する必要があります。
コンストラクタにてインデックスを受け取り、オーバーライドしたGetValueでそのインデックスの値を返します。

// という説明がなんのことやら分からんというのであれば、諦めたほうがいいかも。
引用返信 編集キー/
■97363 / inTopicNo.7)  Re[2]: DataGridViewに配列用の列を追加したい
□投稿者/ WebSurfer (2234回)-(2021/04/30(Fri) 09:39:50)
No97355 (WebSurfer さん) に返信
> ■No97354 (くろこ さん) に返信
>
> DataGridView に MyClass のデータを表示する際は string[] StringParam の配列は
> カンマ区切りの文字列にしてそれを表示というようなことはナシですか?

BindingList<MyClass> の各 MyClass の string[] StringParam の要素数が同じなのですか?

であれば、例えば DataTable を利用し、それに Name, StringParam1, StringParam2, ... StringParamN
という列を動的に作ってから、各 MyClass のデータを DataTable の各 DataRow に取り込んで、
BindingSource 経由で DataGridView にバインドしてやれば望むことができると思います。

各 MyClass の string[] StringParam の要素数が同じではないということでも、要素数が最大の
MyClass を探して、それをベースに上に書いたことと同様なことを行えば可能と思います。

なお、表示だけできればよいと理解しています。編集して結果を書き戻しということも必要なら
上記は忘れてください。
引用返信 編集キー/
■97364 / inTopicNo.8)  Re[5]: DataGridViewに配列用の列を追加したい
□投稿者/ WebSurfer (2235回)-(2021/04/30(Fri) 09:45:16)
No97363 ですが返信先と引用を間違えました。正しくは下記です。私のレスも一緒にまとめて
書いておきます。

No97361 (くろこ さん) に返信

>>あれ、ひょっとして例えば要素数3の配列があったとき、それが3列に展開されることを期待されていますか?
>
> はい、それを期待しています。
> やはり無理なお話でしょうか?

BindingList<MyClass> の各 MyClass の string[] StringParam の要素数は同じなのですか?

であれば、例えば DataTable を利用し、それに Name, StringParam1, StringParam2, ... StringParamN
という列を動的に作ってから、各 MyClass のデータを DataTable の各 DataRow に取り込んで、
BindingSource 経由で DataGridView にバインドしてやれば望むことができると思います。

各 MyClass の string[] StringParam の要素数が同じではないということでも、要素数が最大の
MyClass を探して、それをベースに上に書いたことと同様なことを行えば可能と思います。

なお、表示だけできればよいと理解しています。編集して結果を書き戻しということも必要なら
上記は忘れてください。
引用返信 編集キー/
■97369 / inTopicNo.9)  Re[6]: DataGridViewに配列用の列を追加したい
□投稿者/ くろこ (4回)-(2021/04/30(Fri) 12:54:52)
No97362 (Hongliang さん) に返信
> 不可能ではないですが、リフレクションの知識がいくらか必要になります。
> 自分でDataGridViewColumnを追加していったほうがかえって簡単かもしれません。
>
> BindingList<MyClass>を派生させたクラスMyClassBindingListにITypedListを実装させ、そのGetItemPropertiesにて、自分の最初の要素(全部の要素を見てStringParamの要素数が一番少ない奴、とかでもいいですが)をもとに、StringParamを複数のPropertyDescriptorにします。
>
> PropertyDescriptorの派生クラスも用意する必要があります。
> コンストラクタにてインデックスを受け取り、オーバーライドしたGetValueでそのインデックスの値を返します。
>
> // という説明がなんのことやら分からんというのであれば、諦めたほうがいいかも。

ご返答ありがとうございます!
現段階では何のことやらわからないので、今回のツールではこの方法は諦めて進めることにします。
ですが今回の質問内容は他のツール作成時にも引っかかったところなので
次の勉強の時間がとれるタイミングでリフレクションについて調べ、実装できるようにしたいと思います。
引用返信 編集キー/
■97370 / inTopicNo.10)  Re[6]: DataGridViewに配列用の列を追加したい
□投稿者/ くろこ (5回)-(2021/04/30(Fri) 12:58:29)
2021/04/30(Fri) 12:59:07 編集(投稿者)

No97364 (WebSurfer さん) に返信
>
> であれば、例えば DataTable を利用し、それに Name, StringParam1, StringParam2, ... StringParamN
> という列を動的に作ってから、各 MyClass のデータを DataTable の各 DataRow に取り込んで、
> BindingSource 経由で DataGridView にバインドしてやれば望むことができると思います。

ありがとうございます!
編集は不要ですので、ご提案いただいた方法を試してみようと思います。
DataTableというのを使ったことがないので、調べつつやってみます。
引用返信 編集キー/
■97371 / inTopicNo.11)  Re[7]: DataGridViewに配列用の列を追加したい
□投稿者/ WebSurfer (2238回)-(2021/04/30(Fri) 13:04:21)
No97370 (くろこ さん) に返信

> 編集は不要ですので、ご提案いただいた方法を試してみようと思います。
> DataTableというのを使ったことがないので、調べつつやってみます。

分からないことがありましたら質問してください。
引用返信 編集キー/
■97372 / inTopicNo.12)  Re[8]: DataGridViewに配列用の列を追加したい
□投稿者/ くろこ (6回)-(2021/04/30(Fri) 13:42:37)
No97371 (WebSurfer さん) に返信
> ■No97370 (くろこ さん) に返信
>
>>編集は不要ですので、ご提案いただいた方法を試してみようと思います。
>>DataTableというのを使ったことがないので、調べつつやってみます。
>
> 分からないことがありましたら質問してください。

DataTableを使って、期待通りの状態に実装することができました。
大変助かりました。どうもありがとうございます!

引用返信 編集キー/
■97373 / inTopicNo.13)  Re[3]: DataGridViewに配列用の列を追加したい
□投稿者/ くろこ (7回)-(2021/04/30(Fri) 13:42:56)
WebSurferさん、Hongliangさん

説明下手でわかりにくい質問だったかと思いますが、丁寧にご回答いただきありがとうございました。
自分自身にリフレクションの課題を残しつつ、本件は解決済みとさせていただきます。
本当にありがとうございました!
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -