- - PR -
DataGridViewのColumnTypeを動的に設定したい
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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はできない。 という矛盾に陥ってしまいました。 この考えの間違えている箇所をどなたか指摘してもらえますか? |
|
投稿日時: 2007-05-21 13:17
最近、同じような質問がありましたので、こちらを参照ください。
C# ComboBox列が含まれるDataGridViewをコードから作成する方法 補足しておきますと、 バインドされたテーブルに含まれる各列に対して、 既存の列から DataPropertyName プロパティが列名と等しい列を検索し、 見つかればその列にバインドします。 見つからなければ AutoGenerateColumn プロパティが true の場合 新しく列を生成します。このとき生成された列の DataPropertyName プロパティには列名が設定されます。 AutoGenerateColumn プロパティが false の場合は列を追加しませんし、 その列のデータは表示されません。 つまり、ピンさんがやりたいことは、 列をコードで追加し、追加した列の DataPropertyName を適切に設定した後に、 DataSource に設定してやることで可能と思います。 AutoGenerateColumn プロパティは、念のため false に設定したほうがよいと思います。 |
|
投稿日時: 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") |