Comboの内容をDataGridViewに表示する方法

このQ&Aのポイント
  • VB2005とAccess2003を使用して、Windowsアプリを開発しています。ボタンを押すと、ComboBoxに表示されているSelectedValueの値をDataGridViewのカレント行の3列目のセルに表示したいと思っています。
  • 現在、オブジェクト参照がオブジェクトインスタンスに設定されていないため、エラーが発生しています。どのように修正すれば良いか分からず、質問させていただきました。
  • 参考書のカレント行の指定したセルに値を入力する方法を試してみましたが、他にも方法があれば教えていただきたいです。
回答を見る
  • ベストアンサー

Comboの内容をDataGridViewに表示したい

今回もお世話になります。よろしくお願いします。 VB2005とAccess2003でwindowsアプリを開発しています。 どうしてもつまってしまって先に進まないので教えていただけたら、と思い、投稿しました。 ボタンを押したら、ComboBoxに表示しているSelectedValueの値を、DataGridViewのカレント行の3列目のセルに表示させたいと思っています。 色々やってみたのですが、「オブジェクト参照がオブジェクト インスタンスに設定されていません。」のエラー表示が出てしまい、Nothingになっている箇所もわかっており、試行錯誤したのですが、どのように修正したら良いのかわからず、書かせていただきました。 コードは下記のとおりです。 Dim dg As New System.Windows.Forms.DataGridViewRow dg = TestDataGridView.CurrentRow →「Nothing」です。 Dim i As String i = CStr(Me.ComboBox1.SelectedValue) dg.Cells(2).Value = i ←エラー表示はここで出ます。 ヘルプを見てNewの後がおかしいということはわかったので色々書いたのですがだめでした。Newの後に何を書けばよいかお教えください。 参考書のカレント行の指定したセルに値を入力する、というところを見てやったのですが、何か他に方法があればご教示ください。 どうぞよろしくお願いします。

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

  • ベストアンサー
  • perse
  • ベストアンサー率74% (113/152)
回答No.2

原因はわからないのですが、私は以下のコードで問題なく動作します。 新規のプロジェクトでフォームに DataGridViewとButtonを配置して以下のコードを記述。 '----------------------------------------------------- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '列の追加 For c As Integer = 0 To 5 Me.DataGridView1.Columns.Add("cell" & c.ToString(), "列" & c.ToString()) Next c '行の追加 For r As Integer = 0 To 10 Me.DataGridView1.Rows.Add() Next End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim dg As System.Windows.Forms.DataGridViewRow dg = DataGridView1.CurrentRow dg.Cells(2).Value = dg.Index.ToString() & "行目" End Sub '----------------------------------------------------- このコードでも一段上に表示されるのでしょうか? カレント行は色が変わっているセルのある行です。 あと今回のこととは関係ないのですが、 >メッセージボックスにカレントの列&行を表示させたところ わかっているかもしれませんがデバッグ中であればdebug.printを使ったほうが良いですよ。 Debug.Print("Hello") と記述すれば、イミディエイトウインドウ(Ctrl+G)にHelloと表示されます。 メッセージボックスだとそっちにフォーカスが移ってしますので 予期せぬトラブルを招いてしまうこともありますし。

nanacyanyo
質問者

お礼

こんにちは、回答ありがとうございました。検証までしてくださって、ありがとうございます。 新しいフォームに教えていただいたコードを書いたら問題なく動作しました。色が変わっているセルがカレントになっていました。 自分のDataGridViewがうまく動作しなかったのは私が書いたほかのコードが何か悪さをしてたのかもしれません。 これで挑戦してみます。 debug.printのことですが、知りませんでした…。教えてくださってありがとうございます!調べたら、Write Lineとか色々あるんですね。 活用したいと思います。 この度は親切に回答を下さってありがとうございました!

その他の回答 (1)

  • perse
  • ベストアンサー率74% (113/152)
回答No.1

TestDataGridView.CurrentRowの値がNothingだからです。 選択されているセルが無いのではないでしょうか? どこかで TestDataGridView.CurrentCell = Nothing とかやっていませんか?

nanacyanyo
質問者

お礼

回答ありがとうございました。 選択されているセルが無いのでは?ということで、調べてみました。 TestDataGridView.CurrentCell = Nothing という処理は行っていませんでした。 メッセージボックスにカレントの列&行を表示させたところ、カーソルのある行の一段上の行が、カレントになっていました。なので一番最初に入力しようとしたらエラーになっていたみたいです。2行目にカーソルを移動して同じ処理をすると、一行目にComboのSelectedValueが入りました。 カーソルのある行がカレント行では?と思っていたのですが違うのでしょうか? カーソルのある行を選択状態にするにはどのような処理になるのでしょうか?

nanacyanyo
質問者

補足

検証を続けたところ、ComboのSelectValueを入力するために、DataGridViewの外に配置してあるボタンを押していたので、フォーカスがはずれて選択していた行がカレントではなくなっていたようです。 ボタンを押したときに、新規で行を挿入したらきちんと表示できるようになりました。 最初に書いたコードの上に、 TestBindingSource.AddNew() を追加しました。 フォーカスがはずれても編集中である、という操作があればいいのですが、よくわかりませんでした。 アドバイスがありましたら引き続きお願いいたします。

関連するQ&A

  • DataGridViewのセルをenterキーで横移動したいです。

    VB.NET2005にてDataGridviewのセルを横移動させたいんです。 いろんな物を参考に以下のプログラムを何とかプログラムを組んでみましたが、ビルド時セル(0,0)→セル(0,1)→セル(0,2)→セル(0,3)・・・と1行目がenterキーで移動できず、2行目へ下がってしまいます。2行目からは横移動できるようになりました。 1週間近く試行錯誤しましたが、うまく動きません。 訂正箇所を教えていただけないでしょうか? よろしくお願いします。 いまの行と列の取得 Dim currentRow As Integer = Me.DataGridView1.CurrentRow.Index Dim currentColumn As Integer = Me.DataGridView1.CurrentCell.ColumnIndex Dim nextColumn As Integer = currentColumn + 1 Dim nextRow As Integer = currentRow '押したキーがENTERだったら Dim t As Object t = e.KeyCode() If t = 13 Then If nextColumn = 6 Then '列数が最終列を超えたとき nextColumn = 0 '最初の列数へ Else nextRow -= 1 End If MessageBox.Show("nextColumn =" & nextColumn & "nextRow = " & nextRow) Try Me.DataGridView1.CurrentCell = Me.DataGridView1(nextColumn, nextRow) Catch If Not (Me.DataGridView1.CurrentCell Is Nothing) Then nextColumn = 0 nextRow = 0 Me.DataGridView1.CurrentCell = Me.DataGridView1(nextColumn, nextRow) Exit Sub Else Me.DataGridView1.CurrentCell = Me.DataGridView1(nextColumn, nextRow) Exit Sub End If End Try End If

  • DataGridViewでitemを指定してデータ

    DataGridViewでitemを指定してデータを取得する事はできますか? 下記のように座標を指定して取得する方法はわかります。 Dim IntItem1 As Integer = DataGridView1(j, i).Value DataSetの場合は、DataRowに落として取れます。 Dim DataRow1 As DataRow = DataSet1.Tables("Table1").Rows(0) Dim IntItem1 As Integer = DataRow1("Item1") 同じノリで DataGridViewからアイテムを指定してデータを取得したいのですが下記のような事はできませんでした。 Dim DataGridViewRow1 As DataGridViewRow = DataGridView1.Rows(0) Dim IntItem1 As Integer = DataGridViewRow1("Item1") ← エラー 書き方があれば教えて下さい。

  • VBA 類似処理の件数を同様にする方法について

    ExcelVBAの初歩的な質問です。 【質問内容】 [CheckAcolumnBrank]と[CheckBcolumnBrank]の処理を行った際に、[CheckBcolumnBrank]の結果が[CheckAcolumnBrank]の結果と行数が異なるため(5行ほど多く処理されてしまいます)、[CheckAcolumnBrank]の行数に合わせるコードを知りたいです。 ご見識のある方からの、お知恵の拝借をいただきたく、よろしくお願い申し上げます。 【前提条件】 1.シート1のA5からJ500までの範囲のセルに値が入力されています(空欄セルが不規則にあります)。 2.レコード数は10行程度から450行程度です。 3.A列のセルに値が入っていない場合は、1つ上のセルの値をコピーする挙動です。 4.B列についても、A列と同じ挙動をさせたいです。 5.最終行を求める処理は「GetLastRow」にて行います。 -------------------------------------------- Function GetLastRow() As Long ' 最終行を求める処理 Dim i As Long Dim MaxValue As Long For i = 5 To 500 If Cells(i, "A").Value <> "" Then ' A列からJ列に入力されている値の最大値を求める MaxValue = Application.WorksheetFunction.Max(Range("A" & i & ":J" & i)) If MaxValue > GetLastRow Then GetLastRow = i End If End If Next End Function -------------------------------------------- Private Sub CheckAcolumnBrank() ' A列がブランクの場合、1つ上の値をコピペする処理 Dim currentRow As Long Dim emptyColumns As Boolean Dim Lcont As Long Lcont = GetLastRow Dim ws As Worksheet Set ws = Sheets("シート1") emptyColumns = False ' A列を埋めるループ処理開始 currentRow = 6 Do While currentRow <= Lcont If IsEmpty(ws.Cells(currentRow, 1).Value) Then ws.Cells(currentRow, 1).Value = ws.Cells(currentRow - 1, 1).Value End If ' 終了条件のチェック(E列からJ列がすべて空白、かつA列の1つ上の値が異なる場合に終了) If ws.Cells(currentRow, 5).Value = "" _ And ws.Cells(currentRow, 6).Value = "" _ And ws.Cells(currentRow, 7).Value = "" _ And ws.Cells(currentRow, 8).Value = "" _ And ws.Cells(currentRow, 9).Value = "" _ And ws.Cells(currentRow, 10).Value = "" _ And (ws.Cells(currentRow, 1).Value <> ws.Cells(currentRow - 1, 1).Value) Then Exit Do End If currentRow = currentRow + 1 Loop End Sub -------------------------------------------- Private Sub CheckBcolumnBrank() ' B列がブランクの場合、1つ上の値をコピペする処理 Dim currentRow As Long Dim emptyColumns As Boolean Dim Lcont As Long Lcont = GetLastRow Dim ws As Worksheet Set ws = Sheets("シート1") emptyColumns = False ' ループ開始 currentRow = 6 Do While currentRow <= Lcont If ws.Cells(currentRow, 2).Value = "" Then ws.Cells(currentRow, 2).Value = ws.Cells(currentRow - 1, 2).Value End If ' 終了条件のチェック(E列からJ列がすべて空白、かつB列の1つ上の値が異なる場合に終了) If ws.Cells(currentRow, 5).Value = "" _ And ws.Cells(currentRow, 6).Value = "" _ And ws.Cells(currentRow, 7).Value = "" _ And ws.Cells(currentRow, 8).Value = "" _ And ws.Cells(currentRow, 9).Value = "" _ And ws.Cells(currentRow, 10).Value = "" _ And (ws.Cells(currentRow, 2).Value <> ws.Cells(currentRow - 1, 2).Value) Then Exit Do End If currentRow = currentRow + 1 Loop Set ws = Nothing End Sub --------------------------------------------

  • DataGridViewの再表示方法

    VB2005、SQLServer2005環境です。 FormA、FormBの2つのフォームがあり、FormAはDataGridViewでデータを表示し、 FormBはFormAで選択されたデータを呼び出し修正処理を行っています。 質問は、FormBでデータを登録し、FormBを閉じたタイミングで、 FormAのDataGridViewを再描画して最新のデータを表示したいのですが、うまくいきません。 <FormAで記述しているCD> Private Sub BTN_Data表示ボタン_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BTN_Data表示ボタン.Click Dim strsql As String ' レコードを取得し、データグリッドに表示する '---DB接続 '---SQL文を作成して実行する strsql = "SELECT コード, 氏名 FROM TBLA ORDER BY コード 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, "TBLA") '---DataSet を DataGridView control と連結 dgrSyain.DataSource = ds dgrSyain.DataMember = "TBLA" '---DB切断 Call Disconnect() End Sub <FormBで記述しているCD> Private Sub BTN_更新_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_更新.Click '---FormBの内容を更新する処理----- Me.Close() End Sub 上記の、FormBが閉じる時のイベントで、ResetBindingsを使えばいいのかと思いましたが どこにどう記述すればよいかわかりませんでした。 どうすれば再描画できるでしょうか? ご教授ください。

  • VBの Datagridview 行削除コード

    VB2010でコーディングしています。(VB初心者です。) ネットでDatagridview 行削除コードを調べてボタンに実装したんですが、一回目は削除できるんですが 二回目が削除できません。(削除後にデータを再構築できていない?) ご教授お願いします。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim DT As New DataTable DT = DirectCast(Me.DGV.DataSource, DataTable) Dim 削除 As Boolean = False '選択行の取得 For Each r As DataGridViewRow In Me.DGV.SelectedRows      Dim ID As String = DT.Rows(r.Index).Item("ID").ToString      (その他の処理) 'リスト上削除 Me.DGV.Rows.RemoveAt(r.Index) Next r End Sub

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

    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

  • Excel VBA でテキストボックスの値をセルA列から検索

    いつもお世話になります。 Private Sub CommandButton3_Click() Dim 行 As String Dim 列 As String Dim 最終行 As String Dim 検索行 As String Dim メッセージ As Integer Dim 一致 As Range Dim myNO As Variant Dim i As Long Sheets(3).Select 最終行 = Range("A2").End(xlDown).Offset(1).Select 行 = ActiveCell.Row 列 = ActiveCell.Column myNO = TextBox2.Value 検索行 = Range("A2").End(xlDown).Select ※・・・Set 一致 = Range("A2:検索検").Findwhat:=TextBox2,lookat:=xlWhole) If 一致 Is Nothing Then MsgBox "データがありません。新規コード入力します。" Cells(行, 列 + 0) = UserForm1.TextBox2.Value Cells(行, 列 + 1) = UserForm1.ComboBox7.Value Else i = Cells(行 - 1, "A") Cells(i, 列 + 0) = UserForm1.TextBox2.Value Cells(i, 列 + 1) = UserForm1.ComboBox7.Value End If End Sub 「エラー1004'Range'メソッドは失敗しました'Global'オブジェクト」とでます。※印が黄色になっています。 ユーザーフォーム1のテキストボックスの値をシート3のA列から検索して、一致すれば、A列の一致セルに上書き入力して、一致が無い場合はA列の空白セルに追加入力したいのです。よろしくお願い致します。

  • 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

  • コンボボックスのSelectedItemの使い方

    エリアテーブルを取得し コンボボックスの見える値は「値」にして コンボボックスを取得するときには「コード」を 取れるようにしたいと思っています。 どのように書くと取得できるのでしょうか? バインドするやり方が分からなくて 下記のようになっています。 Dim strSql As String Dim dr As SqlClient.SqlDataReader = Nothing Dim daAdp As New SqlClient.SqlDataAdapter Dim cmd As New SqlClient.SqlCommand Dim ds As DataSet = New DataSet() mConn = New SqlConnection 'DBのオープン  Conn.DbConnect()   Dim dbCmd As SqlCommand = Nothing 'SQL発行 strSQL = "SELECT コード,値 " strSQL = strSQL & "FROM エリア" Conn.ExecSqlSelect(strSql, dr)   ComboBox1.Items.Clear() Do While dr.Read ComboBox1.Items.Add(dr.GetString(1)) ComboBox1.SelectedItem = dr.GetString(0) Loop

  • VB2008

    VB初心者です、よろしくお願いいたします。 現在、VB2008を使い、顧客名簿を作成しています。 前回の質問で、テキストファイルのファイル名だけを取得する方法は分かったのですが、そのファイルの内容をテキストボックスに表示する方法がうまくいきません。 ファイルの内容は 1行目→名前 2行目→メールアドレス 3行目→郵便番号 4行目→住所 5行目→購入した商品 をそれぞれ、textbox1~5に表示させたいと思っています。 書籍などで調べた結果 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim totalcount As Integer Dim oneline As String Dim sr As System.IO.StreamReader sr = New System.IO.StreamReader("C:hogehoge\" & ComboBox1.Text & ".txt") oneline = sr.ReadLine() sr.Close() Dim skipline As Integer Dim r As Random = New Random() skipline = r.Next(totalcount) sr = New System.IO.StreamReader("C:hogehoge\" & ComboBox1.Text & ".txt") Dim i As Integer = 0 Do While i < skipline sr.ReadLine() i += 1 Loop oneline = sr.ReadLine() sr.Close() TextBox1.Text = oneline TextBox2.Text = (skipline + 1).ToString() End Sub このような記述になりました。 textbox1には問題なく名前が表示されますが、textbox2には"1"と表示されてしまいます。 すみませんが、修正箇所を教えていただけませんか? よろしくお願いいたします。

専門家に質問してみよう