- PR -

DataGridViewのColumnTypeを動的に設定したい

投稿者投稿内容
ピン
会議室デビュー日: 2007/05/16
投稿数: 18
投稿日時: 2007-05-21 12:21
いったん閉じたのですが、また疑問が湧いてきました。

グリッドのタイプを指定して列を追加していき枠組み(※1)作ってから
そのあとで一行ずつデータを追加していきました。

表示した後、編集の有無を知るには
DataGridView1.DataSourceをDataTable型の変数に代入(wk_DataTable)し
wk_DataTable.Rows(i).RowStateで参照できるようです。

しかし今までDatasetを使用せずDataGridViewに値を当てはめていたため、
値を以下のようにしようとしました。

@Datasetを作る
ADataGridView1.DataSource = DataTable.Tables("T_TEST")という風に
 グリッドに表示。

↑のようにすると一度にグリッドに表示できますが、既存の枠(※1)に
設定するのは無理のようでかつ、項目をコンボ等にしたい場合できないようです。

つまり
・Datasetでデータを設定するとカラムのタイプを設定できない。
・既存のDataGridViewの枠があると.DataSourceはできない。
という矛盾に陥ってしまいました。

この考えの間違えている箇所をどなたか指摘してもらえますか?
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-05-21 13:17
最近、同じような質問がありましたので、こちらを参照ください。

C# ComboBox列が含まれるDataGridViewをコードから作成する方法

補足しておきますと、
バインドされたテーブルに含まれる各列に対して、
既存の列から DataPropertyName プロパティが列名と等しい列を検索し、
見つかればその列にバインドします。
見つからなければ AutoGenerateColumn プロパティが true の場合
新しく列を生成します。このとき生成された列の DataPropertyName プロパティには列名が設定されます。
AutoGenerateColumn プロパティが false の場合は列を追加しませんし、
その列のデータは表示されません。

つまり、ピンさんがやりたいことは、
列をコードで追加し、追加した列の DataPropertyName を適切に設定した後に、
DataSource に設定してやることで可能と思います。
AutoGenerateColumn プロパティは、念のため false に設定したほうがよいと思います。
ピン
会議室デビュー日: 2007/05/16
投稿数: 18
投稿日時: 2007-05-21 14:27
KIさんたびたびありがとうございます。本当に感謝です。
ゴリ書きのダサいソースになっておりますが、取り急ぎソースを掲載します。

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

Dim dset As New Data.DataSet("DataSet_TEST")
Dim ttable As Data.DataTable = Nothing
Dim dRow As Data.DataRow
Dim comboBoxCol As New Windows.Forms.DataGridViewComboBoxColumn
Dim textBoxCol As New Windows.Forms.DataGridViewTextBoxColumn
Dim textBoxCol2 As New Windows.Forms.DataGridViewTextBoxColumn
Dim bindingsource As New Windows.Forms.BindingSource

'-----------------
'table
'-----------------
'Dataset定義
ttable = dset.Tables.Add("T_TEST")
ttable.Columns.Add("I_ID", Type.GetType("System.Int32"))
ttable.Columns.Add("I_NAME", Type.GetType("System.String"))
ttable.Columns.Add("I_TYPE", Type.GetType("System.String"))

'Datasetにデータを追加
dRow = ttable.NewRow()
dRow(0) = 1
dRow(1) = "aaa"
dRow(2) = "Type A"
ttable.Rows.Add(dRow)
dRow = ttable.NewRow()
dRow(0) = 2
dRow(1) = "bbb"
dRow(2) = "Type B"
ttable.Rows.Add(dRow)
dRow = ttable.NewRow()
dRow(0) = 3
dRow(1) = "ccc"
dRow(2) = "Type B"
ttable.Rows.Add(dRow)

'-----------------
'コンボ作成
'-----------------
'コンボの中身を作成
bindingsource.Add("")
bindingsource.Add("Type A")
bindingsource.Add("Type B")
bindingsource.Add("Type C")
'コンボのタイトル
comboBoxCol.HeaderText = "Types"
'コンボのデータをセット
comboBoxCol.DataSource = bindingsource

'-----------------
'DataGridView定義
'-----------------
'DataColumnの追加
DataGridView1.Columns.Add(textBoxCol)
DataGridView1.Columns(0).DataPropertyName = "I_ID"
DataGridView1.Columns(0).Name = "I_ID(タイトル)"
DataGridView1.Columns.Add(textBoxCol2)
DataGridView1.Columns(1).DataPropertyName = "I_NAME"
DataGridView1.Columns(1).Name = "I_NAME(タイトル)"
DataGridView1.Columns.Add(comboBoxCol)
DataGridView1.Columns(2).DataPropertyName = "I_TYPE"
DataGridView1.Columns(2).Name = "I_TYPE(タイトル)" '←生かされない

'-----------------
'データ表示
'-----------------
'DataGridViewにデータを追加
DataGridView1.AutoGenerateColumns = False
DataGridView1.DataSource = dset.Tables("T_TEST")

'追加してみる
ttable.Rows.Add(4, "ddd", "Type C")


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