• 締切済み

DataGridViewの列スタイルについて

開発環境  VB.NET  SQLServer2008 DataGridViewにDBから取得したデータを一覧表示させようと思っています。 テキストボックスの列、チェックボックス、コンボボックスの列を 追加させることはできたのですが、同一列に異なる種類のコントロールを 配置するということはできるのでしょうか? 例えば・・・ -------------- 行No |列1 -------------- 1   |□ -------------- 2   |□▼ -------------- ・行No1、列1のセルはチェックボックスのセルを表示する ・行No2、列1のセルはコンボボックスのセルを表示する 列を追加しているコードは以下の通りです。 Form_Load時に実行しています。 ------------------------------------------------------------- Private Sub initializeDgvTest() Dim dgv As DataGridView = Me.dgvTest dgv.Columns.Clear() dgv.AutoGenerateColumns = False Dim colLabel As New DataGridViewTextBoxColumn() colLabel.DataPropertyName = "LABEL" colLabel.Name = "LABEL" colLabel.HeaderText = "ラベル" dgv.Columns.Add(colLabel) Dim colVal As New DataGridViewCheckBoxColumn() colVal .DataPropertyName = "VALUE" colVal .Name = "VALUE" colVal .HeaderText = "値" dgv.Columns.Add(colVal ) End Sub ※データのバインドについて  DataTableをDataGridViewのDataSourceに設定しています。 ------------------------------------------------------------- 上記のコードでいうと、 「VALUE」列のコントロールの種類をセル単位で変更しようとしています。 何かいい方法がありましたら、アドバイスよろしくお願いします。 以上です。

みんなの回答

  • ttkai00
  • ベストアンサー率58% (18/31)
回答No.1

標準機能ではできないと思います。 面倒ですが、チェックボックスとコンボボックスの両方を切り替えて表示できるようなユーザーコントロールを作って、それをもとにカスタム列を作成すれば可能は可能でしょう。 参考URLに、カスタム列を作成する方法の説明がります。

参考URL:
http://msdn.microsoft.com/ja-jp/library/7tas5c80.aspx
pooh0128
質問者

お礼

ご回答ありがとうございます。 教えていただいたURLと下記のURLを参考に調べてみました。 http://dobon.net/vb/dotnet/datagridview/maskedtextboxcolumn.html しかし、同一列のセルのコントロールを変更していくとなると、 勉強不足もあり、なかなかうまく実現できていません・・・ うまくDataGridViewのイベント等を使ってできないかと考えてみましたが、 やはり行き詰ってしまいました。 もう少し方法を考えてみます。

関連するQ&A

  • DataGridViewから値取得

    DataGridViewにボタンと項目2つが配置されています。 DataGridView1 DataGridView1.Columns("btn").HeaderText = "ボタン" DataGridView1.Columns("item1").HeaderText = "アイテム1" DataGridView1.Columns("item2").HeaderText = "アイテム2" ボタンを押すと、押した行のレコードを取得したいです。 ボタンのところを押下すると、 イベントハンドラで何行目か分かるサンプルをネットで見つけました。 惜しいですが、やりたいのと少し違いました。 'CellContentClickイベントハンドラ Private Sub DataGridView1_CellContentClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick Dim dgv As DataGridView = CType(sender, DataGridView) Dim test_item1 As String Dim test_item2 As String ' "btn"列ならば、ボタンがクリックされた If dgv.Columns(e.ColumnIndex).Name = "btn" Then MessageBox.Show((e.RowIndex.ToString() + "行のボタンがクリックされました。")) End If ' ここに押された行のitem1の値をセット ' test_item1 = (A) ' ここに押された行のitem2の値をセット ' test_item2 = (B) End Sub (A)、(B)に何を記述すれば値を取得できますか?

  • データグリッドビューの任意の列を削除

    VB2010にて、下記のコードを実行すると、左端にいらない列が表示されます。 左端にコンボボックスを表示したいのですが、うまくいきません。 左端の列を削除する方法。 または、左端にコンボボックスを表示する方法を教えていただけませんでしょうか。 ご存知の方、どうぞよろしくお願いいたします。 '■■■データグリッドビューセット■■■ '初期化 Me.DataGridView1.Columns.Clear() '最下部の新しい行を非表示 Me.DataGridView1.AllowUserToAddRows = False '行追加 Me.DataGridView1.RowCount = 気筒数 + 2 'コンボボックス列を追加 Dim i As Integer Dim BS As New BindingSource() For i = 1 To 系列数 BS.Add(系列名(i)) Next i Dim ComboBox As New DataGridViewComboBoxColumn() ComboBox.HeaderText = "系列名を選択" ComboBox.DataSource = BS Me.DataGridView1.Columns.Add(ComboBox) Me.DataGridView1.Columns(0).Width = 110

  • DataGridViewのセルのItem設定につい

    DataGridView内にコンボボックスのカラムを設定しました。 下記のサイトを参考にしました。 http://dobon.net/vb/dotnet/datagridview/comboboxdropdownstyle.html 入力した内容をカラム単位ではなく、セル単位で追加したかったため、 CellValidatingメソッドを下記の通り一部変更しました。 //CellValidatingイベントハンドラ private void DataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { DataGridView dgv = (DataGridView)sender; //該当する列か調べる if (dgv.Columns[e.ColumnIndex].Name == "sComboColumn" && dgv.Columns[e.ColumnIndex] is DataGridViewComboBoxColumn) { //DataGridViewComboBoxColumn cbc = // (DataGridViewComboBoxColumn)dgv.Columns[e.ColumnIndex]; // // ↓cellへ変更 // DataGridViewComboBoxCell cbc = (DataGridViewComboBoxCell)dgv.Rows[e.RowIndex].Cells[e.ColumnIndex]; //コンボボックスの項目に追加する if (!cbc.Items.Contains(e.FormattedValue)) { cbc.Items.Add(e.FormattedValue); } //セルの値を設定しないと、元に戻ってしまう dgv[e.ColumnIndex, e.RowIndex].Value = e.FormattedValue; } } コンボボックスに入力し、EnterやTabを押したタイミングでコンボボックスのリストに、 入力した文字列が追加されます。また、入力した文字列がセルに表示された状態になります。 しかし、その後同じセルに文字列を入力した場合、リストに文字列が追加されますが、 セルに表示される文字列はその前に入力された文字列のままです。 どのようにすれば入力後のセルの内容を設定できるかご存じの方がいれば ご教授いただきたいです。

  • DataGridViewで教えてください。

    DataGridViewで教えてください。 VB初心者ですが どうかよろしくお願いいたします。 VB2005で DataGirdView(dgv1)の始めの行を 他のDataGridView(dgv2)に追加したいのですが、 うまくいきません。 どうすればよいのでしょうか? すみませんが、 教えてください。 よろしくお願いします。 Dim Table As DataTable Dim MainTable As DataTable Dim row As DataRow Table = DirectCast(dgv1.DataSource, DataTable) MainTable = DirectCast(dgv2.DataSource, DataTable) row = MainTable.NewRow row = Table.Rows(0) MainTable.Rows.Add(row)

  • VB2005EE:DataGridViewでチェックボックスを設けるには

    はじめまして DataGridView(VB2005EE)でチェックボックスを設ける方法を教えていただきたく質問させていただきました。 Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '3つの列を設定し,ABCという列名をつける DataGridView1.ColumnCount = 5 DataGridView1.Columns(0).HeaderText = "A" DataGridView1.Columns(1).HeaderText = "B" DataGridView1.Columns(2).HeaderText = "C" Dim myNewCell As New DataGridViewCheckBoxCell DataGridView1.Columns.Insert(3, New DataGridViewColumn(myNewCell)) DataGridView1.Columns.Item(3).HeaderText = "チェックボックス" DataGridView1.Columns.Item(3).Name = "識別名" DataGridView1.RowCount = 4 '最下行に管理用の行設置 End Sub End Class 手元の本を参考に上記のコードでコンパイルを行うと, >DataGridViewで釣りの例外が発生しました: >System.FormatException:セルのフォーマットされた値に間違った型が>指定されています。 >この既定のダイアログを置き換えるには,DataErrorイベントをハンド>ルしてください。 というエラーダイアログが発生します。 まだプログラミングを始めたばかりという事もあり,右も左もわかりませんが,ご教授お願い致します。

  • VB2005 DataGridViewにチェックボックスを追加する方法

    タイトル通りなのですが VB2005でDataGridViewにチェックボックスを追加したいです。 ############################################################### Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim chColumn As New DataGridViewCheckboxColmun DataGridView1.ColumnCount = 5 DataGridView1.Columns(0).HeaderText = "1" DataGridView1.Columns(1).HeaderText = "2" DataGridView1.Columns(2).HeaderText = "3" DataGridView1.Columns.Insert(4, chColumn) End Sub End Class ############################################################## Dim chColumn As New DataGridViewCheckboxColmun ↑で'型'DataGridViewCheckboxColmunが定義されていません となってしまいます。 どうすればよいでしょうか。。。。 プログラム初めて1週間の初心者なのでお手柔らかに よろしくお願いします。

  • DataGridViewの列に型を設定

    VB2005Expressで開発をしています。 DataGridViewに追加した列に型を設定したいのですが、方法をご存知の 方がいらっしゃいましたら教えて下さい。 列の追加は下記で行いました。 '列を追加できるよう、列の追加機能を一時的に使用可にする '(下記で列を追加するため) Me.ClsDataGridViewEx1.AutoGenerateColumns = False '列を追加 Dim txtColum1 As New DataGridViewTextBoxColumn txtColum1.Name = "追加列" txtColum1.HeaderText = "追加列" ClsDataGridViewEx1.Columns.Add(txtColum1)

  • DataGridViewで行選択して、対応するDataTableの行を得るには?

    いつもお世話になっております。VB2005環境です。 DataGridViewの行を選択したときに、そのソースであるDataTableの同じ行のデータを参照するには、どうしたらいいでしょうか。DataTableのデータをまるごとDataGridViewに表示しているわけではないので、必要に応じて直接DataTableから取得したいです。とても初歩的な質問だと思うのですが・・・。 DataGridView1.DataSource = DataTable  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ Dim r As Integer = DataGridView1.CurrentCell.RowIndex Dim str As String str = DataTable.Rows(r)("項目名") MsgBox(str)  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ このように行インデックスを取得してやってみたのですが、これだとDataGridView上でソートすると行番号が変わってしまい、DataTable側の対応する行のデータが得られません。 もう少し詳しく現状を書くと、まずCSVファイルからデータをロードして、DataTableに渡しています。そして、その内容をDataGridViewに表示しているのですが、表示する内容はデータテーブル通りの構造ではなく、表示する必要がある項目だけを選んで、1つずつカラムを追加してバインドいます。  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ’自動で列を追加しないようにする DataGridView1.AutoGenerateColumns = False ’データソースを指定する DataGridView1.DataSource = DataTable ’1つ1つ順番などを変えながら列を追加していく Dim column1 As New DataGridViewTextBoxColumn() DataGridView1.Columns.Add(column1) column1.Name = "Date" column1.HeaderText = "日付" column1.DataPropertyName = "F4" Dim column2 As New DataGridViewTextBoxColumn() DataGridView1.Columns.Add(column1) column1.Name = "Locatoin" column1.HeaderText = "場所" column2.DataPropertyName = "F1" ・ ・ ・  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ こんな感じでなので、表示されていない列のデータについては、必要に応じて直接DataTableから取得したいと思います。アドバイスよろしくお願いいたします<(_ _)>

  • DataGridViewのカラムに自動で連番

    図のようにDataGridViewの2カラム目のコンボボックスに曜日をいれてあります。 DataGridViewは入力すると行が自動で増えていきますが コンボボックスを選択した段階でカラム1に1,2,3と連番をいれたいのですが 可能でしょうか 環境 windows XP 開発 Microsoft VisualBasic Express 2010 曜日の表示はサイトの例題をはりつけています。 Dim column As New DataGridViewComboBoxColumn() 'ComboBoxのリストに表示する項目を指定する column.Items.Add("日曜日") column.Items.Add("月曜日") column.Items.Add("火曜日") column.Items.Add("水曜日") column.Items.Add("木曜日") column.Items.Add("金曜日") column.Items.Add("土曜日") '"Week"列にバインドされているデータを表示する column.DataPropertyName = "Week" '"Week"列の代わりにComboBox列を表示する DataGridView1.Columns.Insert(DataGridView1.Columns("Week").Index, column) DataGridView1.Columns.Remove("Week") column.Name = "Week"

  • コンボボックスのマウスホイールを無効にしたい

    DataGridView内にコンボボックスを設定しております。 マウスのホイールボタンは、DataGridViewの縦スクロールに 使いたいのですが、DataGridView内のコンボボックスに カーソルがある場合、コンボボックス内のデータが変わってしまいます。 ユーザー側と打ち合わせた結果、コンボボックスにカーソルが ある時に、マウスのホイールボタンを無効に出来ないかと 言われております。 色々調べてみましたが、私では分からず、教えて下さい。 (サンプルソース) Dim column1 As New DataGridViewComboBoxColumn() With DataGridView1 .Columns.Clear() .Columns.Add("Col01", "列1") With column1 .Items.AddRange(New String() {"Item01", "Item02", "Item03"}) .Name = "Col02" .HeaderText = "列2" End With .Columns.Add(column1) For i As Integer = 0 To 100 .Rows.Add() Next i End With

専門家に質問してみよう