#title(.NETプログラミング研究 第9号)

#navi(.NETプログラミング研究)

#contents

*.NETプログラミング研究 第9号 [#qb45e003]

**お知らせ [#h2e8645b]

***掲示板のお引越し [#vb7e636d]

掲示板(どぼん!のVB道掲示板)が下記URLに引っ越しました。新しい掲示板もよろしくお願いいたします。

-[[どぼん!のVB道掲示板>http://dobon.net/cgi-bin/vbbbs/cbbs.cgi]]
-[[どぼん!のVB道掲示板>https://dobon.net/cgi-bin/vbbbs/cbbs.cgi]]

***Visual Studio .NET 2003発売 [#u6912709]

Visual Studio .NET 2003の発売がまもなくのようです。(MSDNではすでに提供が始まったようです。)2002との違いはマイクロソフトの次のページが参考になるかもしれません。(あまりなりませんが。)

-[[Visual Studio .NET 2003 製品情報>http://www.microsoft.com/japan/msdn/vstudio/productinfo/default.asp]]

.NET Frameworkの1.0と1.1の違いに関しては次のページが参考になります。

-[[互換性の問題とバージョン間の変更点>http://www.microsoft.com/japan/msdn/netframework/changeinfo/default.asp]]

**.NET Tips [#x18421a1]

今回も当たり前のように、DataGridコントロール(System.Windows.Forms)に関するTipsを紹介します。

***DataGridの列の幅を変更する [#cd24b91c]

#column(注意){{
この記事の最新版は「[[DataGridの列の幅を変更する>http://dobon.net/vb/dotnet/datagrid/columnwidth.html]]」で公開しています。
この記事の最新版は「[[DataGridの列の幅を変更する>https://dobon.net/vb/dotnet/datagrid/columnwidth.html]]」で公開しています。
}}

DataGridのある列(カラム)の幅を変更するには、 DataGridTableStyleを使用して、列スタイルを指定している必要があります。DataGridTableStyleの使い方が分かれば列の幅の指定法は簡単ですので、ここではDataGridTableStyleの解説を主にさせていただきます。

次の例では、DataGrid1(DataGridオブジェクト)にDataTable1(DataTableオブジェクト、TableName="DataTable1"、ColumnName="Column1"の列が一行だけある)が連結されているものとし、Column1の幅を100にしています。フォームのLoadイベントハンドラ内など適当な場所に記述してください。(この例のようにプログラムにより列スタイルを指定しなくても、デザイナを使って指定することも出来ます。)

#code(vbnet){{
'新しいDataGridTableStyleの作成
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)

'テーブルスタイルをDataGridに追加する
DataGrid1.TableStyles.Add(ts)
}}

#code(csharp){{
//新しいDataGridTableStyleの作成
DataGridTableStyle ts = new DataGridTableStyle();
//マップ名を指定する
ts.MappingName = "DataTable1";

//新しい列スタイルの作成
DataGridTextBoxColumn cs;
cs = new DataGridTextBoxColumn();
//マップ名を指定する
cs.MappingName = "Column1";
//列ヘッダに表示される文字列
//これを指定しなければ列ヘッダには何も表示されない
cs.HeaderText = "ほげごげ";
//幅を指定する
cs.Width = 100;

//列をテーブルスタイルに追加する
ts.GridColumnStyles.Add(cs);

//テーブルスタイルをDataGridに追加する
DataGrid1.TableStyles.Add(ts);
}}

ここで注意しなければいけないのは、DataGridTableStyleに追加された列しかDataGridに表示されないということです。つまりデータテーブルのすべての列を表示させるには、すべての列について列スタイルを作成し、DataGridTableStyleに追加する必要があります。

またDataGridに表示される列の順番は、データテーブルで指定されている順番ではなく、DataGridTableStyleに追加されている順番となります。

さらに上記の例のように、DataGridTextBoxColumn.HeaderTextプロパティを指定しなければ、列ヘッダには何も表示されなくなってしまいます。

このようなことをいちいち考えるのが面倒ならば、次のようにDataGridColumnStyleが追加されていないDataGridTableStyleを追加することにより、DataGridColumnStyleオブジェクトのコレクションを自動的に作成するという方法もあります。(この時は、MappingName値が重複する新しい DataGridColumnStyleオブジェクトをGridColumnStylesCollectionに追加しようとすると、例外がスローされることに注意してください。)

#code(vbnet){{
'新しいDataGridTableStyleの作成
Dim ts As New DataGridTableStyle()
'マップ名を指定する
ts.MappingName = "DataTable1"

'DataGridTableStyleをDataGridに追加する
'DataGridColumnStyleを追加せずにDataGridTableStyleを追加すると、
'DataGridColumnStyleオブジェクトのコレクションが自動的に作成される
DataGrid1.TableStyles.Add(ts)

'列"Column1"の幅を100にする
DataGrid1.TableStyles("DataTable1"). _
    GridColumnStyles("Column1").Width = 100
}}

#code(csharp){{
//新しいDataGridTableStyleの作成
DataGridTableStyle ts = new DataGridTableStyle();
//マップ名を指定する
ts.MappingName = "DataTable1";

//DataGridTableStyleをDataGridに追加する
//DataGridColumnStyleを追加せずにDataGridTableStyleを追加すると、
//DataGridColumnStyleオブジェクトのコレクションが自動的に作成される
DataGrid1.TableStyles.Add(ts);

//列"Column1"の幅を100にする
DataGrid1.TableStyles["DataTable1"].
    GridColumnStyles["Column1"].Width = 100;
}}

結局、DataGridの列の幅を変更するには、上記のように列スタイルを指定した後、次のようにします。

#code(vbnet){{
'列"Column1"の幅を100にする
DataGrid1.TableStyles("DataTable1"). _
    GridColumnStyles("Column1").Width = 100
}}

#code(csharp){{
//列"Column1"の幅を100にする
DataGrid1.TableStyles["DataTable1"].
    GridColumnStyles["Column1"].Width = 100;
}}

***DataGridの列を削除する、列を非表示にする [#jdddb815]

#column(注意){{
この記事の最新版は「[[DataGridの列を削除する、列を非表示にする>http://dobon.net/vb/dotnet/datagrid/hidecolumn.html]]」で公開しています。
この記事の最新版は「[[DataGridの列を削除する、列を非表示にする>https://dobon.net/vb/dotnet/datagrid/hidecolumn.html]]」で公開しています。
}}

前に示した例のように列スタイルの指定方法が分かると、出来るようになることがかなり増えます。ここでその例をいくつか紹介しましょう。

まずは列を削除する方法です。DataGridに表示されている列を削除するには、列スタイルを指定した後、GridColumnStylesCollection.Removeメソッド(またはGridColumnStylesCollection.RemoveAtメソッド)を使います。

ここではDataGrid1(DataGridオブジェクト)にDataTable1(DataTableオブジェクト、TableName="DataTable1")が連結されているものとし、列"Column1"を削除します。

まずはRemoveAtメソッドの使用法です。

#code(vbnet){{
'GridColumnStylesCollection.RemoveAtメソッドで列を削除する
Dim gcsc As GridColumnStylesCollection
gcsc = DataGrid1.TableStyles("DataTable1").GridColumnStyles

'"Column1"を削除する
'"Column1"がGridColumnStylesCollection内にあるか調べる
If gcsc.Contains("Column1") Then
    '"Column1"のインデックスの取得
    '"Column1"がGridColumnStylesCollection内にない時は-1を返す
    Dim i As Integer
    i = gcsc.IndexOf(gcsc("Column1"))
    'インデックス番号で削除する
    gcsc.RemoveAt(i)
End If
}}

#code(csharp){{
//GridColumnStylesCollection.RemoveAtメソッドで列を削除する
GridColumnStylesCollection gcsc;
gcsc = DataGrid1.TableStyles["DataTable1"].GridColumnStyles;

//"Column1"を削除する
//"Column1"がGridColumnStylesCollection内にあるか調べる
if (gcsc.Contains("Column1"))
{
	//"Column1"のインデックスの取得
	//"Column1"がGridColumnStylesCollection内にない時は-1を返す
	int i;
	i = gcsc.IndexOf(gcsc["Column1"]);
	//インデックス番号で削除する
	gcsc.RemoveAt(i);
}
}}

次にRemoveメソッドの使用法です。

#code(vbnet){{
'GridColumnStylesCollection.Removeメソッドで列を削除する
Dim gcsc As GridColumnStylesCollection
gcsc = DataGrid1.TableStyles("DataTable1").GridColumnStyles

'"Column1"を削除する
'"Column1"がGridColumnStylesCollection内にあるか調べる
If gcsc.Contains("Column1") Then
    '削除する
    gcsc.Remove(gcsc("Column1"))
End If
}}

#code(csharp){{
//GridColumnStylesCollection.Removeメソッドで列を削除する
GridColumnStylesCollection gcsc;
gcsc = DataGrid1.TableStyles["DataTable1"].GridColumnStyles;

//"Column1"を削除する
//"Column1"がGridColumnStylesCollection内にあるか調べる
if (gcsc.Contains("Column1"))
{

    //削除する
    gcsc.Remove(gcsc["Column1"]);
}
}}

次に列を非表示にする方法を考えてみます。

一番手っ取り早い方法は列の幅を0にすることです。列の幅を変更する方法は前のTipsをご覧ください。(ヘルプでも列を非表示にする方法としてこの方法が紹介されているようです。)

またDataColumnオブジェクトのColumnMappingプロパティをMappingType.Hiddenにするという方法もあります。

#code(vbnet){{
'DataTableオブジェクトの作成
Dim dt As DataTable
dt = New DataTable("DataTable1")

'DataColumnオブジェクトの作成
Dim dc As DataColumn
dc = New DataColumn("Column1", GetType(String))
dc.ColumnMapping = MappingType.Hidden
'列の追加
dt.Columns.Add(dc)

'連結する
DataGrid1.DataSource = dt
}}

#code(csharp){{
//DataTableオブジェクトの作成
DataTable dt = new DataTable("DataTable1");

//DataColumnオブジェクトの作成
DataColumn dc1 = new DataColumn("Column1", typeof(string));
dc1.ColumnMapping = MappingType.Hidden;
//列の追加
dt.Columns.Add(dc1);

//連結する
DataGrid1.DataSource = dt;
}}

**コメント [#k0dddd47]
#comment

//これより下は編集しないでください
#pageinfo([[:Category/.NET]],2010-06-03 (火) 06:00:00,DOBON!,2010-03-20 (土) 02:37:44,DOBON!)
[ トップ ]   [ 編集 | 差分 | バックアップ | 添付 | 複製 | 名前変更 | リロード ]   [ 新規 | 子ページ作成 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]