ここから本文です

続 C# ListViewのColumnsにオリジナルのプロパティを追加する方法

miw********さん

2012/2/818:41:42

続 C# ListViewのColumnsにオリジナルのプロパティを追加する方法

前回の『C# ListViewのColumnsにオリジナルのプロパティを追加する方法』のことで、質問させてください。

前回ベストアンサーに選ばせて頂いた回答にあるサンプルコードで、プロパティを追加することはできたのですが、値を取得するとき、サンプルコードにある独自のプロパティ SortAsString の場合、

bool A = this.myColumnHeader1.SortAsString;

では取得できるのですが、

bool A = this.myListView1.Columns[0].SortAsString

では取得できなくて。。。

この方法で取得できるようにするには、どうしたらよいのでしょうか?

いろいろ調べてみたのですが、どうしても見つけられなくて教えて頂けたらと思います。


前回のサンプルコードは、

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1478884734

のベストアンサーの回答に書いてあります。


よろしくお願いしますm(_ _)m

閲覧数:
331
回答数:
2
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

編集あり2012/2/1008:26:39

とりあえず、
bool A = ((MyColumnHeader)this.myListView1.Columns[0]).SortAsString;
のようにすれば取得できます。


次のようにすれば、

bool A = this.myListView1.Columns[0].SortAsString

で取得できるようになりますが、Form を編集するたびに Form?.Designer.cs の

this.myListView1.Columns.AddRange(〜)

が削除されてしまい、カラムが表示されなくなってしまうと思います。
(手作業で myListView1.Columns.AddRange(〜) を記述すると、実行時には表示されますがデザイン時には消えたままだと思います。)

(1) MyColumnHeaderCollection.cs を追加

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
class MyColumnHeaderCollection : ListView.ColumnHeaderCollection
{
public MyColumnHeaderCollection(MyListView owner)
: base((ListView)owner)
{
}

public new MyColumnHeader this[int index]
{
get
{
return (MyColumnHeader)base[index];
}
}

public new MyColumnHeader this[string key]
{
get
{
return (MyColumnHeader)base[key];
}
}
}
}

(2) MyListView.cs を次のように変更

using System;
using System.Drawing.Design;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
class MyListView : ListView
{
private MyColumnHeaderCollection myColumns;

public MyListView()
{
myColumns = new MyColumnHeaderCollection(this);
}

[Editor(typeof(MyColumnCollectionEditor), typeof(UITypeEditor))]
public new MyColumnHeaderCollection Columns
{
get
{
return myColumns;
}
}
}
}



追記
いろいろ試してみましたが、私には二律背反になっているように思えます。
つまり、

bool A = this.myListView1.Columns[0].SortAsString;

で取得できるようにするためには

public new MyColumnHeaderCollection Columns

にしなければなりませんが、これだとカラムが消えてしまいます。
カラムが消えないようにするためには

public new ColumnHeaderCollection Columns

にしなければなりませんが、これだと

bool A = this.myListView1.Columns[0].SortAsString;

では取得できません。

また、List<MyColumnHeader> を使用した方法も私にはわかりませんでした。

bool A = this.myListView1.Columns[0].SortAsString;

の代わりに

bool A = this.myListView1.MyColumns[0].SortAsString;

で取得できるようにするくらいしか思いつきません。

以下、

bool A = this.myListView1.MyColumns[0].SortAsString;

で取得できるようにした MyListView.cs の修正版です。

using System;
using System.Drawing.Design;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
class MyListView : ListView
{
private MyColumnHeaderCollection myColumns;

public MyListView()
{
myColumns = new MyColumnHeaderCollection(this);
}

[Editor(typeof(MyColumnCollectionEditor), typeof(UITypeEditor))]
public new ColumnHeaderCollection Columns
{
get
{
return (ColumnHeaderCollection)myColumns;
}
}

public MyColumnHeaderCollection MyColumns
{
get
{
return myColumns;
}
}
}
}

質問した人からのコメント

2012/2/10 11:01:36

成功 新しく同じようなプロパティを作ってしまう方法は思いつかなかったです(;^_^A

同一プロジェクト以外から使うことを考えると、アクセス修飾子が必要になる部分が前回のコードにも、今回のコードにもありましたが、すべて解決しました(^_^)/
すごく助かりましたm(_ _)m

本当にありがとうございましたm(_ _)m

ベストアンサー以外の回答

1〜1件/1件中

miw********さん

2012/2/907:50:18

>nlfotisさんへ

前回同様、サブID を取得して書かせてもらいました。今度は、消さずの残しておくつもりです。


前回のサンプルコードのように、デザインの変更をしてもコードが消えず、今回の質問のようにすることは無理ってことでしょうか?

確かに、教えて頂いた両方のやり方で取得はできるのですが、完成するまでにデザインを何度も変更することも多々ありますし、忘れっぽいのでなるべくなら同じ方法で取得したいって思いまして。。。

DLLファイルにして、使う時に参照設定に追加して使うつもりなので、コード自体は複雑になっても構わないので、両方をクリアできる方法って何かないでしょうか?


素人並みの私ですが、

bool A = ((MyColumnHeader)this.myListView1.Columns[0]).SortAsString;

で取得できるって教えて頂いて思いついたのが、前回のサンプルコードをそのまま使って、

MyListView.cs に

using System.Collections.Generic;

を追加して、

public List<MyColumnHeader> ColumnsList = new List<MyColumnHeader>();

を増やして、この中に (MyColumnHeader)this.myListView1.Columns にあたる部分をリストにしておくのもありかもって思ったのですが、そうする場合、プロパティウィンドウの Columns で追加したものをどのように追加できますか?

アプリ本体のコードで Columns を増やすこともあるので、この方法で問題ないのかも教えてもらえたらと思いますm(_ _)m

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる