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

このQ&Aのポイント
  • DataGridViewでの行選択時に、対応するDataTableの行のデータを取得する方法について質問です。
  • DataGridViewとDataTableのデータ表示方法について、行選択時のデータ取得方法をご教示ください。
  • VB2005環境で、DataGridViewで行選択した際に、対応するDataTableの行のデータを取得する方法をお教えください。
回答を見る
  • ベストアンサー

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から取得したいと思います。アドバイスよろしくお願いいたします<(_ _)>

質問者が選んだベストアンサー

  • ベストアンサー
  • AlexSuns
  • ベストアンサー率67% (78/115)
回答No.4

下記のようにすれば良いと思いますよ #3434430 [VB2005] Dim dgr As System.Windows.Forms.DataGridViewRow = Me.DataGridView1.CurrentRow Dim drv As System.Data.DataRowView = CType(dgr.DataBoundItem, System.Data.DataRowView) Dim dr As System.Data.DataRow = CType(drv.Row, System.Data.DataRow)

new_hope
質問者

お礼

どうもありがとうございます! DataGridViewの表示順に関係なく、データソースの対応するレコードを無事時取得することが出来ました。本当にどうもありがとうございました。 回答してくださった皆様、つたない質問ですみませんでした。

その他の回答 (3)

  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.3

ただ、単にセルの情報を非表示するにはDatagridview の列を非表示にすればよいのでは  また、最初から表示する必要がないのなら列からはずせばよいと思います。 Datagridview については調べれば簡単にわかると思います。 参考: ★DataGridの列を削除する http://dobon.net/vb/dotnet/datagrid/hidecolumn.html ほか ★Datagridview http://dobon.net/vb/dotnet/datagrid/ 上記参考のHPをみて研究してください。 追記、いちいちCSVを DataTbale に設定しなくとも A.No1でもうしあげたとおりOledataAdpter の方法で 可能です。 全体的な見直しをしてみたほうがいいと思いますよ。

new_hope
質問者

補足

ご返信ありがとうございます。 質問の内容は、DataGridViewで選択した行と同じレコードを、ソースになっているDataTableから得るにはどうしたらよいか、ということです。 質問文に書いたとおり、表示する必要の無い列は最初から追加していません。また、一旦追加して列の情報を非表示にしたりもしてみましたが、やはり追加していないときと同じで値を取得することが出来ませんでした。非表示にしたり、最初から外している列のセルの値を、ソースになっているDataTableから随時取得する方法をお伺いしております。 例えば通常でしたら、DataGridViewに表示していない列があったとしても、ソースになっているDataTableの同じレコードのIndexを参照すれば非表示にしている列の値を取得できると思います。しかしDataGridViewのカラムクリックで行をソートすると、DataGridView上の順番が変わってしまうので、インデックス値でDataTableから同じレコードを参照することができなくなります。そこで、任意の列の値から逆に、DataTableの行インデックスを取得する方法があればと思いご質問いたしました。 簡単そうですがその方法がなかなか見つからないです。リンクして頂いたサイトは僕も一通り読んだのですが、求めている情報は無いようです。 それと、今作っているプログラムはデータを読んで表示するだけなので、アタプタを介して接続するメリットも無い気がいたします。読み込むCSVファイルは他の方が作ったソフトで出力されており項目を追加したり更新したりすることはありません。 DataTableで、任意の値を含む行を検索したいというだけなのですが、初心者には難しいことなのでしょうか。この点について方法をご存知でしたらアドバイス頂ければと思います。

  • ape5
  • ベストアンサー率57% (85/148)
回答No.2

全てのカラムを表示していないということですが、表示されているカラムの中に主キーのカラムがすべてあるなら、その主キーのカラムの値を使って、SelectメソッドやFindメソッドを使ってDataTableから該当する行を取得してはどうでしょうか。

new_hope
質問者

補足

ご返信ありがとうございます。 ape5さんのおっしゃる方法で出来そうな気がするのですが、もう少し詳しくアドバイス頂いてもよろしいでしょうか。 例えばですが、このDataVridViewにはこのような感じでデータが表示されています。 発売時期 タイトル   著者     評価 200610  望郷     山田一郎   *** 200501  エッセイ集  伊藤さん   ***** 200410   秋      山田一郎   ** しかしDataTableのほうには、他にも「URL」や「コメント」などの項目があります。これらはDataGridViewには表示する必要が無く、選択Rowでなにかのイベントが起こったときだけ取得したいと思っています。DataGridViewにロードしてその列をVisible=Falseにしてみましたが、そうするとデータを受け取ってないときと同じで、値を取得できなくなりました。 タイトルなどから、DataTableで同じ値のあるレコードを検索し、そのインデックスを取得できればよいということですよね? selectメソッドについて調べたのですが、下記のような例が見つかりました。 Dim filterExpression As String Dim returnValue As DataRow() returnValue = DT.Select(filterExpression) ちょっと自分なりにいじってみたのですが、わかりませんでした。ここからこの行のインデックスを取得する方法をご教授願えないでしょうか。

  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.1

Datagridview にDATATABLE をしているのはともかく、 最初はできることから簡単なプログラムを作成することをお勧めします。 最初は Mdb形式のデータベースなどから初めてコツを覚えてからといのが普通です。 市販されている解説書などでプログラムを作ってみては??? Datagridview 複数のレコードを扱うので (1)行が消された。(2)新規の行が追加された。 (3)行が更新された。 などのイベントを検出して Row を制御するのは 大変です。 できないわけではないですが。 まずは一行ずつ操作できるように画面を作成してコントロールします。 以下のサイトをごらんください。 ●ADO.NETでCSV形式テキストファイルを読み込む http://park5.wakwak.com/~weblab/selectTextFile.html DATATABLE の更新状態はRowstate の値を参照することにより削除、追加、更新など がわかります。 VB.net は非接続型の方法ですのでこのような方法をとります。 コミットするか Rowstate をリセットすると状態がかわります。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >>表示する必要がある項目だけを選んで、1つずつカラムを追加してバ>>インドいます ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ これは データをDatagridview にどのデータを読み込ませるか というのは OleDataAdpter の仕事です。 さきの 参考のURLをご覧になればわかりますが  データを Select ~ により 抽出できます。 どのデータを抽出したいのかを書くこことにより.  OleDataAdpter がデータを Fill した際に DataTable に抽出した 結果を充填します。 これにより、プログラムで画面を開いた、あるいはボタンを押したなどのアクションの際にDatagridview は抽出結果を表示できます。 更新ボタンが押されたなどの処理は 更新する場合は OleDataAdpter の Update メソッドを使います。 Update メソッド に使用する更新方法はあらかじめ SQL 文で  Update ほにゃららTBL SET xxx=mmm where A1 = ? というような命令を OleDataAdpter のUpdateCommand に記述します。 ? の部分はパラメータとして渡す部分です。 同様に Insert やDelete も設定します。 ◆◆◆◆  はずしてたならごめんなさいね  

new_hope
質問者

お礼

ご返信ありがとうございます。 DataGridViewは単に表形式にデータを表示し、選択レコードによってURLを開くなど、簡単な処理に使用しております。でも、DataGridViewはそのように使うのが一般的ではないようで、どうしてもデータベースの操作の情報しか出てこなくて困っておりました。 DataGridViewを使いこなすにはやはりデータベースの勉強も必要なようですね。がんばってみます。 改めて、どうもありがとうございました。

関連するQ&A

  • 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」列のコントロールの種類をセル単位で変更しようとしています。 何かいい方法がありましたら、アドバイスよろしくお願いします。 以上です。

  • vb.net datagridviewの列位置変更

    vb.net datagridviewの列位置を変更する方法を教えて下さい。 データグリッドビューにDataTable(DBから抽出したデータ)を割り当てました。 DataGridView1.DataSource = DataTable1 ここに、カラムを追加しました Dim column As New DataGridViewButtonColumn() '列の名前を設定 column.Name = "Button" '全てのボタンに"詳細閲覧"と表示する column.UseColumnTextForButtonValue = True column.Text = "詳細閲覧" 'DataGridViewに追加する DataGridView1.Columns.Add(column) この追加したカラムを一番左に表示したいです。

  • DataTableのデータを保存したい

    VB初心者です VB2008を使用してカロリー計算ができるプログラムを作成しています DataTableに摂取カロリーと消費カロリーをユーザが追加でき、 そのDataTableのデータをCSVファイルとして保存しようと考えています こちらのサイトhttp://pckowaza.web.fc2.com/html/vbdotnet_datagridview_savetocsv.html からコピーしてやってみたのですが Public Sub SaveToCsv(tempDgv As System.Windows.Forms.DataGridView)' のパラメータ 'tempDgv' に対して引数が指定されていません。 とエラーが出ます どこを直せば良いのでしょうか? 以下、プログラムです '保存したいDataGridViewコントロールの名前を引数として '設定します。 Public Sub SaveToCsv(ByVal tempDgv As DataGridView)   '1行もデータが無い場合は、保存を中止します。   If tempDgv.Rows.Count = 0 Then     Exit Sub   End If   '変数を定義します。   Dim i As Integer   Dim j As Integer   Dim strFileName As String   Dim strResult As New System.Text.StringBuilder   '保存ダイアログでファイル名を設定した場合に処理を実行します。   If Me.sfdCsvFile.ShowDialog = _     Windows.Forms.DialogResult.OK Then     'コラムヘッダを1行目に列記します。     '※ヘッダ行が不要な場合は削除可能です。     For i = 0 To tempDgv.Columns.Count - 1       Select Case i         Case 0          strResult.Append("""" & _          tempDgv.Columns(i).HeaderText.ToString & """")         Case tempDgv.Columns.Count - 1          strResult.Append("," & """" & _          tempDgv.Columns(i).HeaderText.ToString & _          """" & vbCrLf)         Case Else          strResult.Append("," & """" & _          tempDgv.Columns(i).HeaderText.ToString & """")       End Select     Next     'データを保存します。     '※新規行の追加を認めている場合は、次行の     「tempDgv.Columns.Count - 1」を     '「tempDgv.Columns.Count - 2」としてください。     For i = 0 To tempDgv.Rows.Count - 1       For j = 0 To tempDgv.Columns.Count - 1         Select Case j           Case 0            strResult.Append("""" & _            tempDgv.Rows(i).Cells(j).Value.ToString & _            """")           Case tempDgv.Columns.Count - 1            strResult.Append("," & """" & _            tempDgv.Rows(i).Cells(j).Value.ToString & _            """" & vbCrLf)           Case Else            strResult.Append("," & """" & _            tempDgv.Rows(i).Cells(j).Value.ToString & _            """")         End Select       Next     Next     'ファイル名を保存ダイアログで指定した値に設定します。     strFileName = Me.sfdCsvFile.FileName     'Shift-JISで保存します。     Dim swText As New System.IO.StreamWriter(strFileName, _       False, System.Text.Encoding.GetEncoding(932))     swText.Write(strResult.ToString)     swText.Dispose()   End If End Sub DataGridViewの定義?はこれです Designer.vbに書かれていたものです 'DataGridView1 ' Me.DataGridView1.AutoGenerateColumns = False Me.DataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize Me.DataGridView1.Columns.AddRange(New System.Windows.Forms.DataGridViewColumn() {Me.名前DataGridViewTextBoxColumn, Me.カロリーkcalDataGridViewTextBoxColumn}) Me.DataGridView1.DataSource = Me.DataTable1BindingSource3 Me.DataGridView1.Location = New System.Drawing.Point(424, 35) Me.DataGridView1.Name = "DataGridView1" Me.DataGridView1.RowTemplate.Height = 21 Me.DataGridView1.Size = New System.Drawing.Size(429, 422) Me.DataGridView1.TabIndex = 3 ' '名前DataGridViewTextBoxColumn ' Me.名前DataGridViewTextBoxColumn.DataPropertyName = "名前" Me.名前DataGridViewTextBoxColumn.HeaderText = "名前" Me.名前DataGridViewTextBoxColumn.Name = "名前DataGridViewTextBoxColumn" ' 'カロリーkcalDataGridViewTextBoxColumn ' Me.カロリーkcalDataGridViewTextBoxColumn.DataPropertyName = "カロリー(kcal)" Me.カロリーkcalDataGridViewTextBoxColumn.HeaderText = "カロリー(kcal)" Me.カロリーkcalDataGridViewTextBoxColumn.Name = "カロリーkcalDataGridViewTextBoxColumn" '

  • 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)

  • 【datagridview のDataSourceでdatagridv

    【datagridview のDataSourceでdatagridviewにデータを表示して、URLをハイパーリンクで表示する。】 いつもお世話にになります。 さて、DBにテーブルがあり、それにはひとつのカラムしかないと仮定します。そのカラムの内容はURL(例:http://www.okwave.jp)です。そのテーブルをDataSourceに設定してdatagridviewに表示する事はできました。しかし、このURLはハイパーリンクではないので、クリックしてもブラウザに自動的に表示されません。 どうにか、以下の方法で、セルの文字列ををハイパーリンクとして設定をする事ができましたが、どうやらこれの方法は新しくカラムを追加をしてしまうようです。(.addメソッドでカラムを追加してするようです。)自分が実現したいのでは、すでにあるカラムをハイパーリンクにしたいのです。 DataGridViewLinkColumn dgvlc1 = new DataGridViewLinkColumn(); dgvlc1.DataPropertyName = "link"; dgvlc1.HeaderText = "URL"; dgvlc1.Width = 400; dataGridView1.Columns.Add(dgvlc1); DataSourceを使ってdatagridviewにデータを表示した後、ハイパーリンクにする方法はあるのでしょうか? よろしくお願い致します。

  • 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)に何を記述すれば値を取得できますか?

  • DataTableの件数に関して

    フォーム上に”DataGridView”を貼り付け、そこへ1行ずつ、複数行データを入力するような 事を考えています。 厳密には、”DataGridView”のセルをダブルクリックした時に、他のDBから検索された 結果を貼り付ける(表示)ような事をしています。 その際に、”Datatable”と”DataGridView”をバインドし、ダブルクリックされたら”DataTable” へ追加し表示というような事をしていますが、1件目(1行目)をクリック⇒表示、2件目(2行目) クリック⇒表示という場合には正しく表示されますが、1件目(1行目)クリック⇒表示の後、再度 1行目をクリックして表示した場合、なぜか”DataTable”の件数が、追加もしていないのに 最初から2件となっていて、さらに処理が終わった後には、2件となっているはずが3件となって いて、さらに空白の行が追加されてしまっています。 どうしてもこの現象から脱する事ができず、助けて頂ければと思います。 “DataTable”への追加は、問題ないかとは思われますが、、、 ★ 記述内容 Dim data_row As DataRow = dtTable.NewRow() data_row("発注番号") = PIN_発注番号 data_row("発注日付") = KIN_発注日付 dtTable.Rows.Add(data_row) DataGridView1.DataSource = dtSet.Tables(0) 教えて下さい。 よろしくお願いします。

  • DataGridViewの行取得

    VB2010です。 DataGridViewのDataSourceにコレクションを設定しており、 このコレクションのアイテムを指定してDataGridViewに表示されている行インデックスを取得したい。 以下、現状のコードです。Form1にDataGridView、ボタン、テキストボックスを貼り付けており、 テキストボックスに名前を入力してボタンをおすとその行を選択状態とします。 行を取得するために行頭から順に調べておりますが、 アイテムを指定して行を参照できるようなプロパティなり なにか良い方法が無いでしょうか? Public Class Form1 Private _persons As Collection Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load _persons = New Collection _persons.Add(New Person With {.Name = "あかい", .Age = 10}, "あかい") _persons.Add(New Person With {.Name = "いまい", .Age = 13}, "いまい") _persons.Add(New Person With {.Name = "うかい", .Age = 43}, "うかい") _persons.Add(New Person With {.Name = "えのき", .Age = 8}, "えのき") _persons.Add(New Person With {.Name = "おかの", .Age = 3}, "おかの") DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect DataGridView1.DataSource = _persons Dim col As New DataGridViewColumn col = New DataGridViewTextBoxColumn col.DataPropertyName = "Name" col.Name = "NameField" DataGridView1.Columns.Add(col) col = New DataGridViewTextBoxColumn col.DataPropertyName = "Age" col.Name = "AgeField" DataGridView1.Columns.Add(col) End Sub Private Class Person Public Property Name As String Public Property Age As Integer End Class Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim name As String = TextBox1.Text If name.Length = 0 Then Return If Not _persons.Contains(name) Then Return Dim person As Person = _persons.Item(name) For i As Integer = 0 To DataGridView1.Rows.Count - 1 Dim rowItem As Person = DataGridView1.Rows(i).DataBoundItem If rowItem.Equals(person) Then DataGridView1.Rows(i).Selected = True End If Next End Sub End Class

  • 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の列にコンボボックスを表示する方法

    言語:VB2005 データベース:SQLServer 非接続型のデータアクセスです。 .net勉強中の初心者です。件名の件について悩んでいますのでご教授お願いします。 http://dobon.net/vb/dotnet/datagridview/datagridviewcomboboxcolumn.html 上記HPを参考に勉強しています。 DataGridViewComboBoxColumnを使用する方法ではうまく表示できましたが、 DataSourceプロパティを使用する方法ではうまくできません。 (1)の処理を行うとまず、ID 所属コード 所属名称 がDataGridViewにバインドされます。 そこに(2)の処理を行い 所属名称を コンボボックスに変更したいのですが、所属名称の後に 列名が空白のコンボボックスが新たに追加作成されてしまいます。 そして下記のエラーが発生します。 System.FormatException: DataGridViewComboBoxCell の値が有効ではありません この既定のダイアログを置き換えるには、DataError イベントをハンドルしてください。 いったい何がおかしいのか???です。よろしくお願いします。 '**************************************** '(1)DataGridViewにデータをバインドする '**************************************** strsql = "SELECT ID, 所属コード, t1.名称 as 所属名称 FROM ATBL LEFT OUTER JOIN BTBL ON ATBL.所属 = BTBL.コード ORDER BY ID" Dim comm As SqlCommand = New SqlCommand(strsql, Con) Dim dataadapter As SqlDataAdapter = New SqlDataAdapter(comm) dataadapter.MissingSchemaAction = MissingSchemaAction.AddWithKey Dim ds As DataSet = New DataSet() dataadapter.Fill(ds, "テーブル") dgrview.DataSource = ds dgrview.DataMember = "テーブル" '---------------------------------------------------------------------- '(2)DataGridViewにComboBoxを設定する(DataSourceプロパティを使用した例) '---------------------------------------------------------------------- Dim DataSource As New DataTable("DataSource") DataSource.Columns.Add("Value", GetType(String)) DataSource.Columns.Add("code", GetType(Integer)) DataSource.Rows.Add("", 0) DataSource.Rows.Add("小学校", 1) DataSource.Rows.Add("中学校", 2) DataSource.Rows.Add("高校", 3) Dim column As New DataGridViewComboBoxColumn() column.DataPropertyName = "所属名称" column.DataSource = DataSource column.ValueMember = "code" column.DisplayMember = "Value" dgrview.Columns.Add(column)

専門家に質問してみよう