none
DataGridView コントロールの列の順序を変更したい RRS feed

  • 質問

  • DataDridViewのヘッダーの一部に並んでいる列 4月~12月1月~3月 を2月を先頭に1月までの順に並べ替える方法を考えています。2月が11列目にあるとすると

    dataGridView1.Columns[11].DisplayIndex = 1;

    ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

    dataGridView1.Columns[10].DisplayIndex = 12;

    とすれば,いいのかなと思い「2月の列順を特定する方法」を調べたところ,

    http://dobon.net/vb/dotnet/datagridview/allowordercolumn.html に

    //列"Column1"の現在の位置を取得する
    Console.WriteLine(DataGridView1.Columns["Column1"].DisplayIndex);

    //列"Column1"を先頭に移動する
    DataGridView1.Columns["Column1"].DisplayIndex = 0;
    とありましたが,どちらの場合もColumns[ ]には整数値を指定するように思うのですがどうなのでしょうか?

    「2月の列順を特定する方法」を教えていただきたいと思います。

     

     

     

    2010年8月2日 4:16

回答

  • どちらの場合もColumns[ ]には整数値を指定するように思うのですがどうなのでしょうか?

    DataGridView.Columns は DataGridViewColumnCollection 型です。[ ] でアクセスするのはインデクサといいますが、これは一般に Item という名前の(引数付きの)プロパティとして扱われます。で、MSDN で DataGridViewColumnCollection.Item を見れば分かりますが

    DataGridViewColumnCollection.Item プロパティ (System.Windows.Forms)

    int と string どちらも引数に指定できます。string を使用する場合、DataSource を使ってるなら普通は列名になるでしょう。int なら Columns に Add した順番ですね。

    要するにどっちでも構いません、使いやすい、理解しやすい方を使って下さい。

    • 回答としてマーク Koyan 2010年8月2日 7:45
    2010年8月2日 5:02
  • とありましたが,どちらの場合もColumns[ ]には整数値を指定するように思うのですがどうなのでしょうか?

    Columns["Column1"]のように文字列でも良いですし、整数値でもかまいません。

    ご質問の意味が全体的にあいまいなのですが、参考にされているページに書かれていることを応用すれば、比較的簡単にご希望のことが実現できると思うのですが、つまづいているところがあればそれを具体的に示していただくと、的確な回答が付きやすいと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク Koyan 2010年8月2日 7:45
    2010年8月2日 5:06
    モデレータ
  • 「2月」という名前の列がないんでしょう。全角の「2」ではなく半角の「2」だったとか。「02」だったとか。漢数字だったとか。

    Columns[11] で問題ないのならそれで良いと思いますけど。

    • 回答としてマーク Koyan 2010年8月2日 7:45
    2010年8月2日 7:06
  •             //dataGridView1.Columns[11].DisplayIndex = 1;
                dataGridView1.Columns["2月"].DisplayIndex = 1;

    下のようにしますと,NullRefrenceExceptionはハンドルされませんでした。

    dataGridView1.Columns[11].Nameで何と表示されるか確認してみると良いと思います。

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク Koyan 2010年8月2日 7:45
    2010年8月2日 7:17
    モデレータ
  • Hongriangさん,trapemiyaさん,ご教授ありがとうございます。

    >int と string どちらも引数に指定できます。

                //列"2月"を先頭に移動する
                //dataGridView1.Columns[11].DisplayIndex = 1;
                dataGridView1.Columns["2月"].DisplayIndex = 1;

    下のようにしますと,NullRefrenceExceptionはハンドルされませんでした。

    オブジェクト参照がオブジェクト インスタンスに設定されていません。

    とのエラーになってしまい,対処の方法がわからないでいます。

    • 回答としてマーク Koyan 2010年8月2日 7:45
    2010年8月2日 6:57

すべての返信

  • どちらの場合もColumns[ ]には整数値を指定するように思うのですがどうなのでしょうか?

    DataGridView.Columns は DataGridViewColumnCollection 型です。[ ] でアクセスするのはインデクサといいますが、これは一般に Item という名前の(引数付きの)プロパティとして扱われます。で、MSDN で DataGridViewColumnCollection.Item を見れば分かりますが

    DataGridViewColumnCollection.Item プロパティ (System.Windows.Forms)

    int と string どちらも引数に指定できます。string を使用する場合、DataSource を使ってるなら普通は列名になるでしょう。int なら Columns に Add した順番ですね。

    要するにどっちでも構いません、使いやすい、理解しやすい方を使って下さい。

    • 回答としてマーク Koyan 2010年8月2日 7:45
    2010年8月2日 5:02
  • とありましたが,どちらの場合もColumns[ ]には整数値を指定するように思うのですがどうなのでしょうか?

    Columns["Column1"]のように文字列でも良いですし、整数値でもかまいません。

    ご質問の意味が全体的にあいまいなのですが、参考にされているページに書かれていることを応用すれば、比較的簡単にご希望のことが実現できると思うのですが、つまづいているところがあればそれを具体的に示していただくと、的確な回答が付きやすいと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク Koyan 2010年8月2日 7:45
    2010年8月2日 5:06
    モデレータ
  • Hongriangさん,trapemiyaさん,ご教授ありがとうございます。

    >int と string どちらも引数に指定できます。

                //列"2月"を先頭に移動する
                //dataGridView1.Columns[11].DisplayIndex = 1;
                dataGridView1.Columns["2月"].DisplayIndex = 1;

    下のようにしますと,NullRefrenceExceptionはハンドルされませんでした。

    オブジェクト参照がオブジェクト インスタンスに設定されていません。

    とのエラーになってしまい,対処の方法がわからないでいます。

    • 回答としてマーク Koyan 2010年8月2日 7:45
    2010年8月2日 6:57
  • 「2月」という名前の列がないんでしょう。全角の「2」ではなく半角の「2」だったとか。「02」だったとか。漢数字だったとか。

    Columns[11] で問題ないのならそれで良いと思いますけど。

    • 回答としてマーク Koyan 2010年8月2日 7:45
    2010年8月2日 7:06
  •             //dataGridView1.Columns[11].DisplayIndex = 1;
                dataGridView1.Columns["2月"].DisplayIndex = 1;

    下のようにしますと,NullRefrenceExceptionはハンドルされませんでした。

    dataGridView1.Columns[11].Nameで何と表示されるか確認してみると良いと思います。

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク Koyan 2010年8月2日 7:45
    2010年8月2日 7:17
    モデレータ
  • >dataGridView1.Columns[11].Nameで何と表示されるか確認してみると良いと思います。
    "月DataGridViewTextBoxColumn10"となっておりました。それで,これでは使いずらいのでm2(他も同様に)として実際の場面で使っていくことにします。

    Hongriangさん,trapemiyaさん,ご教授ありがとうございました。

     

    2010年8月2日 7:44
  • もう解決してるようなので完全蛇足になりますが、

    > dataGridView1.Columns["2月"].DisplayIndex = 1;
    > 下のようにしますと,NullRefrenceExceptionはハンドルされませんでした。

    DataGridViewColumn.HeaderText が "2月" になっていたのだと思います。
    慣れないうちは HeaderText と Name を混同しやすいので、以下のように理解するといいかと思います。

    DataGridViewColumn.HeaderText  ヘッダーに表示される文字列です。
    DataGridViewColumn.Index      DataGridView.Columns コレクション内の相対位置を取得します。
    DataGridViewColumn.Name      DataGridViewColumn の識別名を表します。

    dataGridView1.Columns のインデクサに上記 Index もしくは Name を指定すると、該当する DataGridViewColumn のインスタンスにアクセスできます。以下のコードを試していただくと、より理解できるかと思います。

    C#

    foreach ( DataGridViewColumn col in this.dataGridView1.Columns ) {
    
        Debug.WriteLine("----------------------------");
    
        Debug.WriteLine(col.Index);
        Debug.WriteLine(col.HeaderText);
        Debug.WriteLine(col.Name);
    
        // インデクサにインデックスで指定
        DataGridViewColumn col1 = Me.grdHistory.Columns(col.Index);
        Debug.WriteLine("インデクサにインデックスで指定");
        Debug.WriteLine(col1.Index);
        Debug.WriteLine(col1.HeaderText);
        Debug.WriteLine(col1.Name);
    
        // インデクサに名前で指定
        DataGridViewColumn col2 = Me.grdHistory.Columns(col.Name);
        Debug.WriteLine("インデクサに名前で指定");
        Debug.WriteLine(col2.Index);
        Debug.WriteLine(col2.HeaderText);
        Debug.WriteLine(col2.Name);
    }
    
    

    VB

    For Each col As DataGridViewColumn In Me.grdHistory.Columns
    
        Debug.WriteLine("----------------------------")
    
        Debug.WriteLine(col.HeaderText)
        Debug.WriteLine(col.Index)
        Debug.WriteLine(col.Name)
    
        ' インデクサにインデックスで指定
        Dim col1 As DataGridViewColumn = Me.grdHistory.Columns(col.Index)
        Debug.WriteLine("インデクサにインデックスで指定")
        Debug.WriteLine(col1.HeaderText)
        Debug.WriteLine(col1.Index)
        Debug.WriteLine(col1.Name)
    
        'インデクサに名前で指定
        Dim col2 As DataGridViewColumn = Me.grdHistory.Columns(col.Name)
        Debug.WriteLine("インデクサに名前で指定")
        Debug.WriteLine(col2.HeaderText)
        Debug.WriteLine(col2.Index)
        Debug.WriteLine(col2.Name)
    Next
    
    

    ひらぽん http://d.hatena.ne.jp/hilapon/
    2010年8月2日 8:35
    モデレータ
  • >慣れないうちは HeaderText と Name を混同しやすいので、以下のように理解するといいかと思います。

    ひらぽんさんのおっしゃるように,HeaderTextばかりに注目していましたので,エラーが出たとき,「なんで?!」とパニックに落ちいてしまったのでした。詳しく解説していただきました。お礼申します。

     

    2010年8月2日 10:09