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

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

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

Re[4]: c# classのメンバの値をテーブル表示したい


(過去ログ 139 を表示中)

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

■81963 / inTopicNo.1)  c# classのメンバの値をテーブル表示したい
  
□投稿者/ MAC (1回)-(2016/11/25(Fri) 12:31:11)

分類:[C#] 

C#の経験者様、教えてください。
C#初心者です。CやC++はある程度経験があります。

Visual Stdio 2015 C#を用いてアプリを作成しています。
あるclass のすべてのメンバの値を表示するテーブルを生成したいと考えています。

例えば、以下のクラスの情報を

class test {
	int a;
	int b;
	int c;
	int d;
	int e;
	string s1;
	string s2;
}

以下のように表示する画面を作りたいです。

| item | value |
|------+-------|
| a    | 1     |
| b    | 2     |
| c    | 30    |
| d    | 20    |
| e    | 5     |
| s1   | test  |
| s2   | hello |

自分の少ない経験からだと、使用するコントロールは、
datagrid コントロールくらいしか思いつかないのですが、
要素は列方向(横方向)にしか追加ができないため適当でないと考えています。

また、今回の例では、classのメンバ数は少ないですが、
本来表示したいclass 数、およびそのメンバー数は大量にあるため、
手作業で要素を追加する以外の方法(たとえば、コードで追加するや、
csv形式で生成してあるテーブルを読み込むことで、要素を追加できる)
といった方法も調べておりますが、なかなかよい方法が見当たりません。

なにかよい方法はございませんでしょうか?
もしありましたら、是非ご教授いただきたいと思います。

初歩的な質問で申し訳ありませんが
よろしくお願いいたします。 

引用返信 編集キー/
■81965 / inTopicNo.2)  Re[1]: c# classのメンバの値をテーブル表示したい
□投稿者/ 魔界の仮面弁士 (989回)-(2016/11/25(Fri) 12:58:35)
No81963 (MAC さん) に返信
> 例えば、以下のクラスの情報を

全部のメンバーが private になっていますが、本当に良いのですか?

もしもこれらのメンバーが public なプロパティだったのなら、
PropertyGrid で表示させることもできるのですが。


test objTest;
public Form1()
{
  InitializeComponent();

  PropertyGrid propertyGrid1 = new PropertyGrid();
  propertyGrid1.Name = "propertyGrid1";
  propertyGrid1.Dock = DockStyle.Fill;
  Controls.Add(propertyGrid1);

  objTest = new test() { a = 12, b = 34, s2 = "TEST" };
  propertyGrid1.SelectedObject = objTest;
}



本当に、private なフィールドのみで構成されているのだとしたら、
外部からは Reflection でしか取り出せなくなってしまいます。


var fs = objTest.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
listBox1.DataSource = fs.Select(f => $"{f.Name}\t{f.GetValue(objTest)}").ToArray();


> 以下のように表示する画面を作りたいです。
ListView を使うのは如何でしょうか。
エクスプローラーで、右側の詳細表示に使われているコントロールです。


> datagrid コントロールくらいしか思いつかないのですが、
> 要素は列方向(横方向)にしか追加ができないため適当でないと考えています。
任意の行数・列数にできますよ。

public Form1()
{
  InitializeComponent();
  DataGridView dgv = new DataGridView();
  dgv.Dock = DockStyle.Fill;
  dgv.AllowUserToAddRows = false;
  dgv.RowCount = 2000;
  dgv.ColumnCount = 40;
  Controls.Add(dgv);
}


> 初歩的な質問で申し訳ありませんが

質問内容が、本当に初歩的かどうかを判断できるのであれば、
その人はもはや初心者ではないと思います。(^^;
引用返信 編集キー/
■81966 / inTopicNo.3)  Re[2]: c# classのメンバの値をテーブル表示したい
□投稿者/ MAC (3回)-(2016/11/25(Fri) 13:37:58)
No81965 (魔界の仮面弁士 さん) に返信
> ■No81963 (MAC さん) に返信
>>例えば、以下のクラスの情報を
>
> 全部のメンバーが private になっていますが、本当に良いのですか?
>
> もしもこれらのメンバーが public なプロパティだったのなら、
> PropertyGrid で表示させることもできるのですが。
>
すみません。public です!!
説明用にさらっと書いたため、抜けてしまいました。

>
> test objTest;
> public Form1()
> {
>   InitializeComponent();
>
>   PropertyGrid propertyGrid1 = new PropertyGrid();
>   propertyGrid1.Name = "propertyGrid1";
>   propertyGrid1.Dock = DockStyle.Fill;
>   Controls.Add(propertyGrid1);
>
>   objTest = new test() { a = 12, b = 34, s2 = "TEST" };
>   propertyGrid1.SelectedObject = objTest;
> }
>
説明ありがとうございました。
PropertyGridを試してみました。なかなかよさそうですが、

1.ユーザーに編集させたくない
2.property属性をもたせるために、元にあるclassのコードの記述変更が必要(以下のように)
 なため、手間がかかる。

ので、今回は見送りしたいと思いました。


class test
{
public int a;

public int my_a
{
get { return a; }
set { a = value; }
}

public int b;
public int c;
public int d;
public int e;
public string s1;
public string s2;
}

>
>
> 本当に、private なフィールドのみで構成されているのだとしたら、
> 外部からは Reflection でしか取り出せなくなってしまいます。
>
>
> var fs = objTest.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
> listBox1.DataSource = fs.Select(f => $"{f.Name}\t{f.GetValue(objTest)}").ToArray();
>
>
>>以下のように表示する画面を作りたいです。
> ListView を使うのは如何でしょうか。
> エクスプローラーで、右側の詳細表示に使われているコントロールです。
>
これもよさそうですね。調べてみます。

>
>>datagrid コントロールくらいしか思いつかないのですが、
>>要素は列方向(横方向)にしか追加ができないため適当でないと考えています。
> 任意の行数・列数にできますよ。
>

その通りでしたね。ありがとうございます。

> public Form1()
> {
>   InitializeComponent();
>   DataGridView dgv = new DataGridView();
>   dgv.Dock = DockStyle.Fill;
>   dgv.AllowUserToAddRows = false;
>   dgv.RowCount = 2000;
>   dgv.ColumnCount = 40;
>   Controls.Add(dgv);
> }
>

>
>>初歩的な質問で申し訳ありませんが
>
> 質問内容が、本当に初歩的かどうかを判断できるのであれば、
> その人はもはや初心者ではないと思います。(^^;

どうもありがとうございました。
少し進めそうな気がします。
引用返信 編集キー/
■81967 / inTopicNo.4)  Re[3]: c# classのメンバの値をテーブル表示したい
□投稿者/ 魔界の仮面弁士 (990回)-(2016/11/25(Fri) 15:41:08)
No81966 (MAC さん) に返信
> 1.ユーザーに編集させたくない
readonly なプロパティにすることで編集できなくなりますが、
今回の要件には合わなさそうですね。


> 2.property属性をもたせるために、元にあるclassのコードの記述変更が必要(以下のように)
>  なため、手間がかかる。
下記のように書けますよ。

class test
{
 public int a { get; set; }
 public int b { get; set; }
 public int a { get; set; }
 public int d { get; set; }
 public int e { get; set; }
 public string s1 { get; set; }
 public string s2 { get; set; }
}


>>ListView を使うのは如何でしょうか。
>>エクスプローラーで、右側の詳細表示に使われているコントロールです。
> これもよさそうですね。調べてみます。
サンプルはこのあたりに。
http://www.atmarkit.co.jp/fdotnet/dotnettips/258listviewadd/listviewadd.html
引用返信 編集キー/
■81968 / inTopicNo.5)  Re[4]: c# classのメンバの値をテーブル表示したい
□投稿者/ MAC (4回)-(2016/11/25(Fri) 16:44:52)
魔界の仮面弁士 さん、

いろいろ教えてくださいありがとうございました。
C#の書き方や、いろいろなコントロールを教えてくださり非常に勉強になりました。

結論からいうと、TreeGridView というカスタムのコントロールを使用するつもりです。

https://blogs.msdn.microsoft.com/markrideout/2006/01/08/customizing-the-datagridview-to-support-expandingcollapsing-ala-treegridview/

まず私がやりたいことは、DataGridViewで普通にできました。(すみません。勉強不足でした。。)
- item とvalue という二つの列を追加し、
- あとは、
dataGrid_classa.Rows.Add("a", "1")
dataGrid_classa.Rows.Add("b", "2")
...
と追加するだけでした。

そこまでできた後、複数のクラスを扱うので階層構造にしたくなり、
TreeGridView というのが簡単そうだったので、試したところ、よさげなので、
このコントロールを使って実装してみます。

取り急ぎ御礼まで。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -