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

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

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

Re[6]: リストボックスの項目に(コレクション)と表示される


(過去ログ 71 を表示中)

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

■41479 / inTopicNo.1)  リストボックスの項目に(コレクション)と表示される
  
□投稿者/ estmo (2回)-(2009/09/20(Sun) 17:16:37)

分類:[C#] 

2009/09/20(Sun) 17:17:34 編集(投稿者)
やじゅです。estmoさんの質問に回答しようとしたら、ERROR-タイトルは半角60字以内!
となって、回答が付けられなかったため、タイトルも短くして新規スレッドとしました。

名前をestmoさんとして一時登録します。



いつもお世話になっております。
estmoと申します。

C#のリストボックスの行項目の表示内容(項目標題)に関して質問させてください。

List<>を継承し、ToString()のoverrideを実装したオブジェクトを
リストボックスにAddしたところ、ToString()で返している文字列ではなく
"(コレクション)"と表示されてしまいます。
通常であればToString()で返している文字列が表示されると思うのですが、
何故か正しく表示されません。

原因、解決法を知っている方がいれば、教えていただけないでしょうか。
望みはList<>を継承したオブジェクトで実装したToString()の返却値を
Addで登録したリストボックスに表示することです。

【環境】
C# 2008 ExpressEdition

【サンプルソース】
public class A : List<string>
{
  public override string ToString()
  {
    return "テストテスト";
  }
}

public partial class B : Form
{
  ...
  public B_Load(object sender, EventArgs e)
  {
    this.listBox.Items.Add(new A());
  }
}

これでBクラス(フォーム)のリストボックスの一行目に"(コレクション)"と表示されてします。
正しくは "テストテスト" と表示したい。


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

引用返信 編集キー/
■41480 / inTopicNo.2)  Re[1]: リストボックスの項目に(コレクション)と表示される
□投稿者/ やじゅ (1337回)-(2009/09/20(Sun) 17:18:04)
やじゅ さんの Web サイト
2009/09/20(Sun) 18:06:21 編集(投稿者)

No41477 (estmo さん) に返信
> リストボックスにAddしたところ、ToString()で返している文字列ではなく
> "(コレクション)"と表示されてしまいます。

listBox.Itemsは、String型以外のどんな型でも格納されてしまうので、
new A()だけだと、Obejct型として格納されて、それがコレクション型で
あったため、リスト表示的には"(コレクション)"と変換されて
表示されたんでしょう。

でも、まー"(コレクション)"って表示されたってことは
中の処理で、Object.ToString()が実行はされたけど、
new A().ToString()としては実行されなかったってことですよね。

最初から文字列としてセットすれば想定した結果にはなります。

this.listBox.Items.Add(new A());

this.listBox1.Items.Add(new A().ToString());
引用返信 編集キー/
■41482 / inTopicNo.3)  Re[2]: リストボックスの項目に(コレクション)と表示される
□投稿者/ estmo (3回)-(2009/09/20(Sun) 18:11:21)
やじゅさん

新規スレッドの立上げと、
早速のご回答ありがとうございます。

回答内容に関してですが、
求めている回答と少し違っていたので補足ささせてください。

リストボックスには「Stringオブジェクト」ではなく、
あくまで「List<string>を継承しているオブジェクト」を
Addした上で期待する結果が表示される方法を求めています。

質問時の【サンプルソース】であれば、
class Bを書換えずに、どうclass Aを書換えれば
"テストテスト"と表示することができるか?
です。

それと一番の関心事は解決法ではなく原因で、
何故ToStringの返却値ではなく、
継承元の型名が表示されたか?
というところです。

いろいろと申し訳ありませんが、
よろしくお願いいたします。

引用返信 編集キー/
■41483 / inTopicNo.4)  Re[1]: リストボックスの項目に(コレクション)と表示される
□投稿者/ 渋木宏明(ひどり) (1221回)-(2009/09/20(Sun) 18:17:19)
渋木宏明(ひどり) さんの Web サイト
> 原因、解決法を知っている方がいれば、教えていただけないでしょうか。

原因は知りません。
そういう仕様なのかも。

> 望みはList<>を継承したオブジェクトで実装したToString()の返却値を
> Addで登録したリストボックスに表示することです。

もし仕様なら、「できない」が結論かもしれません。
別解は、若干面倒になるけどデータバインドする、です。

引用返信 編集キー/
■41484 / inTopicNo.5)  Re[2]: リストボックスの項目に(コレクション)と表示される
□投稿者/ 渋木宏明(ひどり) (1222回)-(2009/09/20(Sun) 18:24:06)
渋木宏明(ひどり) さんの Web サイト
> 別解は、若干面倒になるけどデータバインドする、です。

・class A に ListBox に表示したい文字列を返すプロパティを実装する
・ListBox.DataMember に↑プロパティの名前を設定する

でもいいみたい。
引用返信 編集キー/
■41486 / inTopicNo.6)  Re[1]: リストボックスの項目に(コレクション)と表示される
□投稿者/ 魔界の仮面弁士 (1308回)-(2009/09/20(Sun) 18:35:48)
2009/09/20(Sun) 18:39:25 編集(投稿者)
No41479 (estmo さん) に返信
> List<>を継承し、ToString()のoverrideを実装したオブジェクトを
> リストボックスにAddしたところ、ToString()で返している文字列ではなく
> "(コレクション)"と表示されてしまいます。

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    listBox1.FormattingEnabled = checkBox1.Checked;
}
private void Form1_Load(object sender, EventArgs e)
{
    listBox1.Items.Add(new A());
    listBox1.Items.Add(DateTime.Now);
}

引用返信 編集キー/
■41487 / inTopicNo.7)  Re[2]: リストボックスの項目に(コレクション)と表示される
□投稿者/ やじゅ (1338回)-(2009/09/20(Sun) 18:45:14)
やじゅ さんの Web サイト
No41486 (魔界の仮面弁士 さん) に返信

this.listBox.Items.Add(new A());
this.listBox1.FormattingEnabled = False;
にしたら、"テストテスト"で表示になりましたね。

このプロパティが関連しているのか、知らんかった。

引用返信 編集キー/
■41490 / inTopicNo.8)  Re[4]: リストボックスの項目に(コレクション)と表示される
□投稿者/ Hongliang (469回)-(2009/09/20(Sun) 19:34:07)
デザイナがらみと勘違いして一通り調べた後スレッドを確認してみて愕然としたけど、一応これでもいけるよデザイナや PropertyGrid でも(コレクション)にならないよというやり方をメモ程度に。

CollectionConverter を継承する HogeConverter を定義する。
ConvertTo を override して、destinationType が String のときに、value.ToString() を(或いは任意の文字列を)返すようにする。
上記 HogeConverter を、List<T> から派生する Hoge クラスの TypeConverterAttribute 属性に設定する。
引用返信 編集キー/
■41493 / inTopicNo.9)  Re[5]: リストボックスの項目に(コレクション)と表示される
□投稿者/ estmo (4回)-(2009/09/20(Sun) 20:55:45)
みなさん
お忙しいところ回答いただき、ありがとうございます。

this.listBox.Items.Add(new A());
this.listBox1.FormattingEnabled = False;
で期待する動作になりました。

ListBox.DisplayMember にプロパティの名前を設定する方法もうまくいきました。
http://dobon.net/vb/dotnet/control/tbdisplaymember.html

【ソース】
public class A : List<string>
{
 public string CCC
 {
  get { return "テストテスト"; }
 }
}

public partial class B : Form
{
 …
 private void B_Load(object sender, EventArgs e)
 {
  this.listBox.Items.Add(new A());
  this.listBox.DisplayMember = "CCC";
 }
}


原因としては、
ToString()以外が表示に使われる設定になっていたためですかね。
勉強になりました。

CollectionConverterに関してはまだ試してないのですが、
勉強して試してみます。

ありがとうございました。


解決済み
引用返信 編集キー/
■41495 / inTopicNo.10)  Re[6]: リストボックスの項目に(コレクション)と表示される
□投稿者/ 渋木宏明(ひどり) (1223回)-(2009/09/20(Sun) 22:15:35)
渋木宏明(ひどり) さんの Web サイト
2009/09/20(Sun) 23:49:25 編集(投稿者)

> 原因としては、
> ToString()以外が表示に使われる設定になっていたためですかね。

FormattingEnabled プロパティのヘルプは読みましたか?

ListBox 相手だと問題なさそーですが、単純に「false にすればいいんだ」とだけ覚えると、ComboBox なんかで意図する動作が得られない場合がありそーです。


引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -