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

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

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

Re[2]: DataGridViewのソートについて


(過去ログ 85 を表示中)

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

■50494 / inTopicNo.1)  DataGridViewのソートについて
  
□投稿者/ なおこ (1回)-(2010/06/08(Tue) 19:52:25)

分類:[.NET 全般] 

お世話になります。
DataGridViewのソートについて教えて頂けないでしょうか。

上記のクラスのリストのListコレクションを使用しDataGridViewのDataSourceを利用し表示させた場合、
DataGridViewのヘッダをクリックしてソートする事ができません。
どのようにソートすれば良いかご教授願えないでしょうか。
Name列、Code列共にクリックしたときに並び替えを行いたいと考えています。

コード:
List<MyClass> list = new List<MyClass>();
list = getList(); //リストオブジェクトを取得するところ
DataGridView dataGridView.DataSource = list;

IComparerインターフェースをMyClassに実装しても並び変わりませんでした。
(IComparerインターフェースを実装してもNameとCodeどちらで並び替えるの指定も必要でしょうか?)

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


クラスの例:
public class MyClass{

private name;
public string Name
{
get { return name; }
set { name = value; }
}

private code;
public string Code
{
get { return code; }
set { code = value; }
}
}
引用返信 編集キー/
■50496 / inTopicNo.2)  Re[1]: DataGridViewのソートについて
□投稿者/ Hongliang (646回)-(2010/06/08(Tue) 20:58:43)
ColumnHeaderMouseClick イベントで自前でソートを実装します。
データソースが List<T> なら、その List<T>.Sort を使ってソートし、DataGridView.Refresh などで更新します。
またソートグリフの表示を行うなら、各列の DataGridViewColumn の SortMode を Programmatic に変更した上で、ソート時にその列の HeaderCell の SortGlyphDirection を設定することになります。

あと細かいことですが、
> List<MyClass> list = new List<MyClass>();
> list = getList(); //リストオブジェクトを取得するところ
このコードを見る限り、初めに List<MyClass> を new する意味が全く無さそうです。
引用返信 編集キー/
■50504 / inTopicNo.3)  Re[2]: DataGridViewのソートについて
□投稿者/ マサヤ (6回)-(2010/06/09(Wed) 10:09:48)
DataGridViewのプロパティ(DataGridViewのタスク)にて列の編集というのがあります。
[動作]項目にてSortModeをAutomaticにする
というのが恐らく一番簡単かなぁ、と。
Sortの特殊ルールとかあるのならダメダメですが。
引用返信 編集キー/
■50509 / inTopicNo.4)  Re[3]: DataGridViewのソートについて
□投稿者/ なおこ (2回)-(2010/06/09(Wed) 14:27:14)
>Hongliang さん
ありがとうございます。
自前でListのソートを行わないとダメと言う事ですね。
ありがとうございます。

>マサヤ さん
SortModeをAutomaticになっているのですが、
DataSourceへListを入れると、列ヘッダーをクリックしても何も反応がありませんでした。
ソートグリフすら表示されない状態でして…
ソートのルールは単純な文字列比較でOKなのですが、上手く認識してくれませんでした。

引用返信 編集キー/
■50516 / inTopicNo.5)  Re[4]: DataGridViewのソートについて
□投稿者/ マサヤ (7回)-(2010/06/09(Wed) 17:42:39)
No50509 (なおこ さん) に返信
> >マサヤ さん
> SortModeをAutomaticになっているのですが、
> DataSourceへListを入れると、列ヘッダーをクリックしても何も反応がありませんでした。
> ソートグリフすら表示されない状態でして…
> ソートのルールは単純な文字列比較でOKなのですが、上手く認識してくれませんでした。
>

すいません。ListをDataSourceにするんですね。
ListからDataTableに入れ替えたりしたらいけないんですかね?
おそらくSortを自作するより簡単か、と。
たとえば、下記のDataRowに値を入れているところでListから取り出した値を入れていただけるとよいかと思います。

DataTable dt = new DataTable();

dt.Columns.Add("ColNo", typeof(Int32));
dt.Columns.Add("ColName", typeof(String));
for (int i = 0; i < 10; i++)
{
DataRow drAdd;

drAdd = dt.NewRow();

drAdd["ColNo"] = i;
drAdd["colName"] = "abc" + i.ToString();

dt.Rows.Add(drAdd);
}
dataGridView1.DataSource = dt;
引用返信 編集キー/
■50517 / inTopicNo.6)  Re[1]: DataGridViewのソートについて
□投稿者/ いしだ (229回)-(2010/06/09(Wed) 19:31:02)
2010/06/09(Wed) 19:32:20 編集(投稿者)
以下のような感じでどうでしょうか。
※ 文字列にしか対応させてません

List<MyClass> list = getList();
dataGridView1.DataSource = new MyClassSortList<MyClass>(list);
.........

class MyClassComparer<T> : IComparer<T> {
  private ListSortDirection direction;
  private PropertyDescriptor prop;

  public MyClassComparer(PropertyDescriptor prop, ListSortDirection direction) {
    this.prop = prop;
    this.direction = direction;
  }

  public int Compare(T x, T y) {
    object objX = x.GetType().GetProperty(prop.Name).GetValue(x, null);
    object objY = y.GetType().GetProperty(prop.Name).GetValue(y, null);

    int ret = objX.ToString().CompareTo(objY.ToString()); // とりあえず文字列のみ。。。
    if ((direction == ListSortDirection.Descending)) {
      ret *= -1;
    }

    return ret;
  }
}

class MyClassSortList<T> : BindingList<T> {
  public MyClassSortList(List<T> list) {
    ((List<T>)Items).AddRange(list);
  }

  protected override bool SupportsSortingCore {
    get { return true; }
  }

  protected override void ApplySortCore(PropertyDescriptor propDescriptor
      , ListSortDirection listDirection) {
    List<T> list = (List<T>)base.Items;

    if (list != null) {
      MyClassComparer<T> comparer = new MyClassComparer<T>(propDescriptor, listDirection);
      list.Sort(comparer);
    }

    OnListChanged(new ListChangedEventArgs(ListChangedType.ItemMoved, propDescriptor));
  }
}

引用返信 編集キー/
■50524 / inTopicNo.7)  Re[2]: DataGridViewのソートについて
□投稿者/ なおこ (3回)-(2010/06/10(Thu) 09:09:42)
>マサヤさん
DataTable等に入れる事も考慮したのですが、件数が多くなると遅くなりそうな気がして
Datasourceプロパティを使用したいと考えた次第です。

>いしださん
サンプルありがとうございます。
こちらを参考にプログラムを組んでみます。



解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -