- PR -

DataGridの並べ替えについて(C# Winフォーム)

投稿者投稿内容
なおこ(・∀・)
大ベテラン
会議室デビュー日: 2004/04/08
投稿数: 174
お住まい・勤務地: 東京都
投稿日時: 2006-02-01 15:59
お世話になります。

引用:

トトロさんの書き込み (2006-02-01 15:43) より:
が http://codezine.jp/a/article.aspx?aid=3 のようにコンボボックスを使っています。
コンボボックスの部分で新しく選択した項目に対してはソートが出来ていません。
dtが新しく選択した項目に対して有効になっていないようです。
どのようにすれば新しく選択した項目にもソートが掛かるでしょうか



DataGrid を継承して、OnMouseUp をオーバーライドしてみました。
コンボボックスで選択した値に対しても
ソートがかかっているように見えたのですが、いかがでしょうか。
コード:
public class MyDataGrid : System.Windows.Forms.DataGrid{
  private int m_clickCount = 0;
  protected override void OnMouseUp(MouseEventArgs e){

    DataGrid.HitTestInfo info = base.HitTest(e.X, e.Y);
    if (info.Type != DataGrid.HitTestType.ColumnHeader ) {
      base.OnMouseUp (e);
      return;
    }

    DataTable dt = (DataTable)base.DataSource;
    string columnName = dt.Columns[info.Column].ColumnName;

    string sort = null;
    if ( this.m_clickCount == 0 ){
      sort = columnName;
      this.m_clickCount++;
    }else if ( this.m_clickCount == 1){
      sort = columnName + " Desc";
      this.m_clickCount++;
    }else if (this.m_clickCount == 2){
      sort = "";
      this.m_clickCount = 0;
    }
    dt.DefaultView.Sort = sort;
  }
}

キラ
大ベテラン
会議室デビュー日: 2005/12/10
投稿数: 104
投稿日時: 2006-02-01 17:53
お世話になります。

すみません、理解できませんでした。
現在のソース

クラス
public class CKanToriPainfForm : System.Windows.Forms.Form

イベント
private void dataGrid1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

上記の部分を変えるのでしょうか。
初歩的な質問ですみませんが、どのように書いたらいいか教えて頂けないでしょうか。

[ メッセージ編集済み 編集者: トトロ 編集日時 2006-02-01 20:57 ]
なおこ(・∀・)
大ベテラン
会議室デビュー日: 2004/04/08
投稿数: 174
お住まい・勤務地: 東京都
投稿日時: 2006-02-01 22:20
お世話になります。
引用:

トトロさんの書き込み (2006-02-01 17:53) より:
クラス
public class CKanToriPainfForm : System.Windows.Forms.Form

イベント
private void dataGrid1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

上記の部分を変えるのでしょうか。
初歩的な質問ですみませんが、どのように書いたらいいか教えて頂けないでしょうか。


上記の私の投稿した例を試す為の環境づくりの事を仰っているのであれば、
MyDataGrid のコードをどこか適当な cs ファイルにコピーして、
(例えば、CKanToriPainfForm がいる名前空間の配下とかに)
CKanToriPainfForm の中で System.Windows.Forms.DataGrid という文字列
を、MyDataGrid と置き換えて、
this.dataGrid1.MouseDown += new System.Windows.Forms.MouseEventHandler ...
の行を消してください。
キラ
大ベテラン
会議室デビュー日: 2005/12/10
投稿数: 104
投稿日時: 2006-02-02 00:05
お世話になります。

回答、ありがとうございました。
明日、早速試してみます。
キラ
大ベテラン
会議室デビュー日: 2005/12/10
投稿数: 104
投稿日時: 2006-02-02 14:22
お世話になります。
引用:

DataGrid を継承して、OnMouseUp をオーバーライドしてみました。
コンボボックスで選択した値に対しても
ソートがかかっているように見えたのですが、いかがでしょうか。
コード:

public class MyDataGrid : System.Windows.Forms.DataGrid{
  private int m_clickCount = 0;
  protected override void OnMouseUp(MouseEventArgs e){

    DataGrid.HitTestInfo info = base.HitTest(e.X, e.Y);
    if (info.Type != DataGrid.HitTestType.ColumnHeader ) {
      base.OnMouseUp (e);
      return;
    }

    DataTable dt = (DataTable)base.DataSource;
    string columnName = dt.Columns[info.Column].ColumnName;

    string sort = null;
    if ( this.m_clickCount == 0 ){
      sort = columnName;
      this.m_clickCount++;
    }else if ( this.m_clickCount == 1){
      sort = columnName + " Desc";
      this.m_clickCount++;
    }else if (this.m_clickCount == 2){
      sort = "";
      this.m_clickCount = 0;
    }
    dt.DefaultView.Sort = sort;
  }
}




上記の方法で対応できました。
ありがとうございました。

[ メッセージ編集済み 編集者: トトロ 編集日時 2006-02-02 14:31 ]
キラ
大ベテラン
会議室デビュー日: 2005/12/10
投稿数: 104
投稿日時: 2006-02-02 16:25
いつもお世話になっております。

追加質問させてください。
データグリッドで所定の列を昇順に並べ替えします。
その列で新しい入力をすると勝手に昇順に並んでしまいます。
新しく入力した項目については次のソートをするまで、ソートされないようには出来ますでしょうか?
なおこ(・∀・)
大ベテラン
会議室デビュー日: 2004/04/08
投稿数: 174
お住まい・勤務地: 東京都
投稿日時: 2006-02-02 17:49
お世話になります。

Sort プロパティは 列単位なので、
難しいと思われます。

未検証ですが、もしやるとしたら Sort プロパティを使わずに、
昇順・降順・初期の並び順毎に
内部で、その時の条件にあったソートをしてある
DataTable とか DataView を DataSource にセットしてやる
とかでしょうか。
キラ
大ベテラン
会議室デビュー日: 2005/12/10
投稿数: 104
投稿日時: 2006-02-02 18:02
いつもお世話になっております。

回答、ありがとうございます。
やはりSortプロパティでは難しいんですね。
他の方法を試してみます。

スキルアップ/キャリアアップ(JOB@IT)