トップ回答者
DataGridView コントロールの列の順序を変更したい

質問
-
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月の列順を特定する方法」を教えていただきたいと思います。
回答
-
どちらの場合も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
-
とありましたが,どちらの場合もColumns[ ]には整数値を指定するように思うのですがどうなのでしょうか?
Columns["Column1"]のように文字列でも良いですし、整数値でもかまいません。
ご質問の意味が全体的にあいまいなのですが、参考にされているページに書かれていることを応用すれば、比較的簡単にご希望のことが実現できると思うのですが、つまづいているところがあればそれを具体的に示していただくと、的確な回答が付きやすいと思います。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/- 回答としてマーク Koyan 2010年8月2日 7:45
-
//dataGridView1.Columns[11].DisplayIndex = 1;
dataGridView1.Columns[11].Nameで何と表示されるか確認してみると良いと思います。
dataGridView1.Columns["2月"].DisplayIndex = 1;下のようにしますと,NullRefrenceExceptionはハンドルされませんでした。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/- 回答としてマーク Koyan 2010年8月2日 7:45
-
Hongriangさん,trapemiyaさん,ご教授ありがとうございます。
>int と string どちらも引数に指定できます。
//列"2月"を先頭に移動する
//dataGridView1.Columns[11].DisplayIndex = 1;
dataGridView1.Columns["2月"].DisplayIndex = 1;下のようにしますと,NullRefrenceExceptionはハンドルされませんでした。
オブジェクト参照がオブジェクト インスタンスに設定されていません。
とのエラーになってしまい,対処の方法がわからないでいます。
- 回答としてマーク Koyan 2010年8月2日 7:45
すべての返信
-
どちらの場合も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
-
とありましたが,どちらの場合もColumns[ ]には整数値を指定するように思うのですがどうなのでしょうか?
Columns["Column1"]のように文字列でも良いですし、整数値でもかまいません。
ご質問の意味が全体的にあいまいなのですが、参考にされているページに書かれていることを応用すれば、比較的簡単にご希望のことが実現できると思うのですが、つまづいているところがあればそれを具体的に示していただくと、的確な回答が付きやすいと思います。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/- 回答としてマーク Koyan 2010年8月2日 7:45
-
Hongriangさん,trapemiyaさん,ご教授ありがとうございます。
>int と string どちらも引数に指定できます。
//列"2月"を先頭に移動する
//dataGridView1.Columns[11].DisplayIndex = 1;
dataGridView1.Columns["2月"].DisplayIndex = 1;下のようにしますと,NullRefrenceExceptionはハンドルされませんでした。
オブジェクト参照がオブジェクト インスタンスに設定されていません。
とのエラーになってしまい,対処の方法がわからないでいます。
- 回答としてマーク Koyan 2010年8月2日 7:45
-
//dataGridView1.Columns[11].DisplayIndex = 1;
dataGridView1.Columns[11].Nameで何と表示されるか確認してみると良いと思います。
dataGridView1.Columns["2月"].DisplayIndex = 1;下のようにしますと,NullRefrenceExceptionはハンドルされませんでした。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/- 回答としてマーク Koyan 2010年8月2日 7:45
-
もう解決してるようなので完全蛇足になりますが、
> 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/