.NETプログラミング研究 第9号 †
お知らせ †
掲示板のお引越し †
掲示板(どぼん!のVB道掲示板)が下記URLに引っ越しました。新しい掲示板もよろしくお願いいたします。
Visual Studio .NET 2003発売 †
Visual Studio .NET 2003の発売がまもなくのようです。(MSDNではすでに提供が始まったようです。)2002との違いはマイクロソフトの次のページが参考になるかもしれません。(あまりなりませんが。)
.NET Frameworkの1.0と1.1の違いに関しては次のページが参考になります。
.NET Tips †
今回も当たり前のように、DataGridコントロール(System.Windows.Forms)に関するTipsを紹介します。
DataGridの列の幅を変更する †
DataGridのある列(カラム)の幅を変更するには、 DataGridTableStyleを使用して、列スタイルを指定している必要があります。DataGridTableStyleの使い方が分かれば列の幅の指定法は簡単ですので、ここではDataGridTableStyleの解説を主にさせていただきます。
次の例では、DataGrid1(DataGridオブジェクト)にDataTable1(DataTableオブジェクト、TableName="DataTable1"、ColumnName="Column1"の列が一行だけある)が連結されているものとし、Column1の幅を100にしています。フォームのLoadイベントハンドラ内など適当な場所に記述してください。(この例のようにプログラムにより列スタイルを指定しなくても、デザイナを使って指定することも出来ます。)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| | Dim ts As New DataGridTableStyle()
ts.MappingName = "DataTable1"
Dim cs As DataGridTextBoxColumn
cs = New DataGridTextBoxColumn()
cs.MappingName = "Column1"
cs.HeaderText = "ほげごげ"
cs.Width = 100
ts.GridColumnStyles.Add(cs)
DataGrid1.TableStyles.Add(ts)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| | DataGridTableStyle ts = new DataGridTableStyle();
ts.MappingName = "DataTable1";
DataGridTextBoxColumn cs;
cs = new DataGridTextBoxColumn();
cs.MappingName = "Column1";
cs.HeaderText = "ほげごげ";
cs.Width = 100;
ts.GridColumnStyles.Add(cs);
DataGrid1.TableStyles.Add(ts);
|
ここで注意しなければいけないのは、DataGridTableStyleに追加された列しかDataGridに表示されないということです。つまりデータテーブルのすべての列を表示させるには、すべての列について列スタイルを作成し、DataGridTableStyleに追加する必要があります。
またDataGridに表示される列の順番は、データテーブルで指定されている順番ではなく、DataGridTableStyleに追加されている順番となります。
さらに上記の例のように、DataGridTextBoxColumn.HeaderTextプロパティを指定しなければ、列ヘッダには何も表示されなくなってしまいます。
このようなことをいちいち考えるのが面倒ならば、次のようにDataGridColumnStyleが追加されていないDataGridTableStyleを追加することにより、DataGridColumnStyleオブジェクトのコレクションを自動的に作成するという方法もあります。(この時は、MappingName値が重複する新しい DataGridColumnStyleオブジェクトをGridColumnStylesCollectionに追加しようとすると、例外がスローされることに注意してください。)
1
2
3
4
5
6
7
8
9
10
11
12
13
| | Dim ts As New DataGridTableStyle()
ts.MappingName = "DataTable1"
DataGrid1.TableStyles.Add(ts)
DataGrid1.TableStyles("DataTable1"). _
GridColumnStyles("Column1").Width = 100
|
1
2
3
4
5
6
7
8
9
10
11
12
13
| | DataGridTableStyle ts = new DataGridTableStyle();
ts.MappingName = "DataTable1";
DataGrid1.TableStyles.Add(ts);
DataGrid1.TableStyles["DataTable1"].
GridColumnStyles["Column1"].Width = 100;
|
結局、DataGridの列の幅を変更するには、上記のように列スタイルを指定した後、次のようにします。
1
2
3
| | DataGrid1.TableStyles("DataTable1"). _
GridColumnStyles("Column1").Width = 100
|
1
2
3
| | DataGrid1.TableStyles["DataTable1"].
GridColumnStyles["Column1"].Width = 100;
|
DataGridの列を削除する、列を非表示にする †
前に示した例のように列スタイルの指定方法が分かると、出来るようになることがかなり増えます。ここでその例をいくつか紹介しましょう。
まずは列を削除する方法です。DataGridに表示されている列を削除するには、列スタイルを指定した後、GridColumnStylesCollection.Removeメソッド(またはGridColumnStylesCollection.RemoveAtメソッド)を使います。
ここではDataGrid1(DataGridオブジェクト)にDataTable1(DataTableオブジェクト、TableName="DataTable1")が連結されているものとし、列"Column1"を削除します。
まずはRemoveAtメソッドの使用法です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| | Dim gcsc As GridColumnStylesCollection
gcsc = DataGrid1.TableStyles("DataTable1").GridColumnStyles
If gcsc.Contains("Column1") Then
Dim i As Integer
i = gcsc.IndexOf(gcsc("Column1"))
gcsc.RemoveAt(i)
End If
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| | GridColumnStylesCollection gcsc;
gcsc = DataGrid1.TableStyles["DataTable1"].GridColumnStyles;
if (gcsc.Contains("Column1"))
{
int i;
i = gcsc.IndexOf(gcsc["Column1"]);
gcsc.RemoveAt(i);
}
|
次にRemoveメソッドの使用法です。
1
2
3
4
5
6
7
8
9
10
| | Dim gcsc As GridColumnStylesCollection
gcsc = DataGrid1.TableStyles("DataTable1").GridColumnStyles
If gcsc.Contains("Column1") Then
gcsc.Remove(gcsc("Column1"))
End If
|
1
2
3
4
5
6
7
8
9
10
11
12
| | GridColumnStylesCollection gcsc;
gcsc = DataGrid1.TableStyles["DataTable1"].GridColumnStyles;
if (gcsc.Contains("Column1"))
{
gcsc.Remove(gcsc["Column1"]);
}
|
次に列を非表示にする方法を考えてみます。
一番手っ取り早い方法は列の幅を0にすることです。列の幅を変更する方法は前のTipsをご覧ください。(ヘルプでも列を非表示にする方法としてこの方法が紹介されているようです。)
またDataColumnオブジェクトのColumnMappingプロパティをMappingType.Hiddenにするという方法もあります。
1
2
3
4
5
6
7
8
9
10
11
12
13
| | Dim dt As DataTable
dt = New DataTable("DataTable1")
Dim dc As DataColumn
dc = New DataColumn("Column1", GetType(String))
dc.ColumnMapping = MappingType.Hidden
dt.Columns.Add(dc)
DataGrid1.DataSource = dt
|
1
2
3
4
5
6
7
8
9
10
11
| | DataTable dt = new DataTable("DataTable1");
DataColumn dc1 = new DataColumn("Column1", typeof(string));
dc1.ColumnMapping = MappingType.Hidden;
dt.Columns.Add(dc1);
DataGrid1.DataSource = dt;
|
コメント †