問題の原因はGridView1.Columns.Add(item)の型変換エラーです

このQ&Aのポイント
  • 質問文章には、データベースからinteger型の値を取得してlistに格納し、それをGridViewに追加する処理が含まれています。
  • しかし、エラーが発生しており、GridView1.Columns.Add(item)の部分で型変換エラーが発生しています。
  • 解決策を見つけるために、エラーメッセージやコードの内容を調査しているが、解決方法がまだ見つかっていません。
回答を見る
  • ベストアンサー

listの格納されている値をGridViewに追加

下記のようなロジックを動かそうとしていますが、うまくいきません。 「データベースからinteger型の値を取得して、それをreadメソッドでlistに一旦格納し、For Eachで1つずつGridviewに追加していく。」 エラー内容でググっても良くわからなかったので、解決策がわかる方がいましたらご助言お願い致します。。 *DBから値を取得し、listに格納するところは問題なく動いていますが、Gridviewに追加するところでこけます。 エラー箇所:GridView1.Columns.Add(item) エラー内容:「型 'Integer' の値をを 'System.Web.UI.WebControls.DataControlField' に変換できません。」 Dim list As List(Of Integer) = New List(Of Integer) Dim result As Integer = Byte.MinValue Do While testReader.Read() result = Convert.ToInt32(testReader("price")) list.Add(result) Loop For Each item In list GridView1.Columns.Add(item) Next

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

  • ベストアンサー
  • skuld777
  • ベストアンサー率70% (7/10)
回答No.2

☆確認 ・ほんとにカラムでいいのですか? ・VS2008Pro+VBで試したソースを書いておきます。 ・ImportsはSystem.DataとSystem.Web.UI.WebControlsです。 ☆サンプルソース ' テストデータ作成(readerじゃないけど・・・) Dim dt As DataTable = New DataTable() Const fld As String = "price" dt.Columns.Add(fld) dt.Columns(fld).DataType = GetType(Integer) For i As Integer = 0 To 3 Dim row As DataRow = dt.NewRow() row(fld) = i dt.Rows.Add(row) Next ' 本題(とりあえず題名通りListに追加) Dim list As List(Of Integer) = New List(Of Integer) Dim result As Integer = Integer.MinValue For Each row As DataRow In dt.Rows result = row(fld) list.Add(result) Next ' カラム作成 For Each item In list Dim field As BoundField = New BoundField() field.HeaderText = item.ToString() GridView1.Columns.Add(field) Next ' 表示されるか確認用 GridView1.DataSource = dt GridView1.DataBind()

その他の回答 (1)

  • skuld777
  • ベストアンサー率70% (7/10)
回答No.1

☆まず確認(間違いないと思うけど・・・) ・ASP.NET+VBですよね? ・Frameworkのバージョンも出来れば提示してほしい。(ジェネリックリスト使ってるから2.0以上だろうけど・・・) ☆エラーの内容 GridView1.Columns.Addの第1引数は、DataControlFieldです。 #実際にはDataControlFieldクラスはMustInheritですので以下のDataControlFieldを継承したクラスを使用します。 #BoundField、ButtonField、CheckBoxField、CommandField、HyperLinkField、ImageField、TemplateField ☆回答 ・カラムを追加しているように見受けられます。 ・ASP.NETではGridViewをコード上でカラム追加や行追加はあまりおすすめ出来ません。DataSetやDataTableをDataSourceにバインドする方向で検討されてはいかがでしょうか? 一応追加するのに参考のURLを↓に書いておきます。

参考URL:
http://social.msdn.microsoft.com/Forums/ja-JP/vwdexpressja/thread/4a499bc6-318e-4418-be85-5ac1149b26b5
holyholy4
質問者

補足

ご助言ありがとうございます。 開発環境:VisualWebDeveloper2008ExpressEdition、vb, Framework3.5 通常はDataSetを使用するのですが、今回はDataSetなどは使用せずコード上でGridViewにデータを追加しなければいけないため、表示させる方法がまったくわかりません。。 【追加コード】 Dim NewField As New BoundField For Each item In list listに格納されたinteger型の値(item)をNewFieldに代入するロジック GridView1.Columns.Add(NewField) Next という形のロジックになるんでしょうか?listに格納されたinteger型の値(item)をNewFieldに代入するロジックはどう書けばいいのでしょうか?見当はずれだったらすみません。。

関連するQ&A

  • LIST型に格納されている値を1つずつ取り出して処理をしたい

    LIST型に格納されている値を1つずつ取り出して処理を行う方法を探しています。 Dim a As List(Of Integer) 具体的には、1・2・3・4・5という数字が格納されているaという変数から格納された値を一つずつ取り出して、足し合わせていくループ処理を書きたいと思っています。15という結果が出せればOKです。 どなたかご助言いただけると助かります。

  • GridViewからの値を全件LOOPして取得したい

    GridViewについて教えてください。 <環境>ASP.NET データソースにSQLDataSourceを指定し、GridViewに全件を自動バインドして表示しています。 画面上に設置したボタン押下のイベントハンドラで、そのGridViewの全行をループして各列の値を参照したいのですが、 以下のようなに記述しても(1)の部分でNOTHINGとなりエラーになります。 どのようにすればよいでしょうか? やりたいことは、GridView全行ループし、ITEMKINDの値が"1"の時、TemplateField内にあるtxtNVERCHARの値を取得することです。 ご教授お願いします。 --------------------------------- <Columns> <asp:BoundField DataField="ITEMKIND" HeaderText="ITEMKIND" Visible="False" /> </asp:BoundField> <asp:TemplateField HeaderText="ITEM"> <ItemTemplate> <asp:TextBox CssClass="txtstr" ID="txtNVERCHAR" runat="server" Text='<%# Bind("ITEM_NVERCHAR", "{0}") %>'></asp:TextBox> </ItemTemplate> </asp:TemplateField> </Columns> --------------------------------- Protected Sub 更新_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnExec.Click For Each row As GridViewRow In grdList.Rows Dim strITEMKIND As TextBox = DirectCast(row.FindControl("ITEMKIND"), TextBox)  ←(1) IF strITEMKIND.Text = "1" THEN Dim strDDL As TextBox = DirectCast(row.FindControl("txtNVERCHAR"), TextBox) End IF Next End Sub

  • GridViewにバインドせずにデータを表示する方法

    環境:VS2008&VB.NET&ASP GridViewに手動でテーブルからデータを読みデータバインドせず DBの値を表示する方法を考えていますがうまくいかず困っています。 (データバインドしたくない理由はデータバインドを行っていると行の挿入や移動ができない認識のためです。) 初心者のため見当違いなことをしているかもしれませんが それも含めまして質問させていただきます。 質問1 そもそもGridViewでデータバインドせずに手動でデータを表示することは可能でしょうか。 質問2 以下のコードで試しましたが「GridView1.Controls(0).Controls.Add(row1)」でExeptionが発生してしまいました。 手順に不適格な箇所があるのでしょうか。 strSql = "SELECT * FROM Data_Table" Using connection As New SqlClient.SqlConnection(cnStr) Dim command As New SqlClient.SqlCommand(strSql, connection) connection.Open() Dim dr As SqlClient.SqlDataReader = command.ExecuteReader While (dr.Read = True) 'データあり str1 = dr("data1") str2 = dr("data2") str3 = dr("data3") End If connection.Close() Dim item1 As DataGridItem item1 = New DataGridItem(-1, -1, ListItemType.Item) Dim cell0 As TableCell = New TableCell item1.Cells.Add(cell0) Dim cell1 As TableCell = New TableCell item1.Cells.Add(cell1) Dim cell2 As TableCell = New TableCell item1.Cells.Add(cell2) Dim row1 As New GridViewRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal) row1.Cells.Add(cell0) row1.Cells.Add(cell1) row1.Cells.Add(cell2) GridView1.Controls(0).Controls.Add(row1) End While End Using エラーの内容 System.ArgumentOutOfRangeException はユーザー コードによってハンドルされませんでした。 Message="指定された引数は、有効な値の範囲内にありません。 パラメータ名: index" お力添えをよろしくお願い致します。

  • 以下のデータがあり、これをExcel VBAの連想配列として格納したい

    以下のデータがあり、これをExcel VBAの連想配列として格納したいと考えています。 MsgBoxでキーとアイテムを表示させると表示されるのですが、 最後に一例としてExistsで確認するとFalseが返ってきます。 これは配列に格納されていないのでしょうか。 また格納されていないとすると、どうすれば格納できるのでしょうか。 A 列   B列 35   apple 37   orange 40   banana 以下がコードです。 sub test() Dim i as integer Dim myDic as Object Dim keys as Variant Set myDic = CreateObject("Scripting.Dictionary") For i = 1 to 3 myDic.Add Cells(i, 1), Cells(i, 2) Next i keys = myDic.keys For Each keys In myDic MsgBox "キー名:" & keys & vbCr & "値:" & myDic.Item(keys) Next keys MsgBox myDic.Exists(35) End Sub

  • Generic.Listに1次元配列の配列を格納したい(VB2005)

    VB2005の質問です。 変数ghogeにString型の1次元配列の配列を格納したいと考えています。 ----------------------------------------------- 'a) Dim hoge()() As string = _       {New string() {"a1", "b1", "c1"}, _       New string() {"a2", "b2", "c2"}, _       New string() {"a3", "b3", "c3"}} Dim ghoge As New Generic.List(of )   'b) MessageBox.Show(ghoge(1)(1))      ' "b2"と表示したい ----------------------------------------------- 質問内容は、(a)を(b)の初期値として設定するにはどのようにすればよいか、ということです。 (b)がGeneric.ListでなくArrayListの場合だと、   Dim ghoge As New ArrayList(hoge) でhoge配列を格納できますが、Generic.Listの場合はどのような構文にすればよいでしょうか。 現在は、下記のような処理でghogeに値を格納しています。 ------------------------------------------------------------ Dim ghoge As New Generic.List(Of Generic.List(Of String)) Dim aryhoge1 As New Generic.List(Of String)(New String() {"a1", "b1", "c1"}) Dim aryhoge2 As New Generic.List(Of String)(New String() {"a2", "b2", "c2"}) gary_hoge.Add(ary_hoge1) gary_hoge.Add(ary_hoge2) MessageBox.Show(gary_hoge(1)(1))    ' "b2"と表示される ------------------------------------------------------------ どうぞよろしくお願い致します。

  • 配列のSession格納、及び取得方法について

    お世話になります。 現在Visual Studio 2005でプログラム作成中です。 質問内容は、 配列(文字列を格納)をSessionに渡し、次ページでその配列の値を取得できるかという点です。 ***(a.aspx.vb)抜粋*** Dim a() As String Redim a(DataTable1.Rows.Count) For i As Integer 0 to DataTable1.Rows.Count - 1 a(i) = CType(DataTable1.Rows(i).Item(0)) Next Session("a.list") = a(DataTable1.Rows.Count) Session("a.count") = DataTable1.Rows.Count ***(b.aspx)抜粋*** Dim b() As String = CType(Session("a.list"), String) Dim bCount as integer = CType(Session("a.count"),Integer) Dim Name as String For i As Integer 0 To bCount Name = CType(b(i),String) Next としているのですが、取得できません。 配列に格納されたものをSessionに格納し、取得することは可能なのでしょうか。 また、その他に適切なものがあればご教授ください。 よろしくお願いいたします。

  • GridView1の選択の指定とダミーデータの追加について

    GridView1とTwxtBox1を用意し GridView1に選択ボタンをつけ押すと、TextBox1にその行の1行目を表示するようにしたいのですが ★に何を入れたら、選択行を指定することができるのでしょうか?教えてください。 Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) TextBox1.Text = GridView1.Rows.Item(★).Cells(1).Text End Sub Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Dim conStr As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString Dim strSQL As String strSQL = "SELECT 1CELL FROM tableA" Using con As New SqlConnection(conStr) Using cmd As NEw SqlCommand(strSQL, con) Dim dr As SqlDataReader con.Open() dr = cmd.ExecuteReader(Data.CommandBehavior.CloseConnection) GridView1.DataSource = dr GridView1.DataBind() dr.Close() End Using End Using End Sub また、GridView1に出ているデータに選択するデータがない場合の為に データーベースにはなくても【-】というデータを常に表示できるようにしたいのですが どのようにしたらいいのでしょうか? 【tableAの1CELL】 AAAAA BBBBB CCCCC DDDDD - ←データベースにはこのデータはないけれどGridView1には常に表示し、これを選択するとTextBox1に【-】が入るようにしたいのですが よろしくお願いします。

  • GridViewのEditTemplate

    すみません。改めて質問させていただきます。 GridViewのEditTemplateにDropDownListが配置されています。 更新したときに、そのDropDownListの値を取得する方法をご教授頂きたいです。 言語はVBです。以下のコードを書きましたが取得できません(Updatingイベントのとき)↓ Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles GridView1.RowUpdating MsgBox(GridView1.Rows(e.RowIndex).ToString) End Sub とりあえずメッセージボックスにドロップダウンリストの値を表示したいです。

  • Excel.Rangeで取得した値を配列に格納するには?

    プログラミング初心者です。 VB.NET でExcelからデータを取得したのですが、配列等に格納したいのですが、うまくできなくて困っています。どなたか教えてください。 例)以下のデータを取得する場合 セルA(列)1(行)からA5まで セルB1からB5まで セルC1からC5まで Dim xl_APP As Excel.Application Dim xl_Book AS Excel.Workbook Dim xl_Sheet As Excel.Seets = xl_Book.Worksheets Dim xl_W_Sheet As Excel.Worksheet = CType(xl_W_Sheet.Item(1),Excel.Worksheet) 中略 Dim range_data As Excel.Range Dim i Integer Dim j Integer Dim strCel As String For i = 1 To 5 For j = 1 To 3 range_data = CType(xl_W_Sheet.Cells(i,j),Excel.Range) strCel = CStr(range_data.Value)  ↑String型変数に格納していますが、多次元配列?に格納して取り出せるようにしたいのですが、どうしたらよいのでしょうか? Next Nest <range_dataに格納されるデータ> A1:氏名 B1:学年 C:1 年齢 以下同上 ・・・・のように取り出したいと考えています。 よろしくお願いします。

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