プロが教えるわが家の防犯対策術!

環境: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"

お力添えをよろしくお願い致します。

A 回答 (2件)

GridViewのRowsコレクションに Addメソッド無いため


コードでGridViewの行の追加が不可能なように思います

DromDownListのItemsなどなら Addメソッドもあるので
バインドしないでも項目の追加が可能だと思われます

SQLServerなら SQLDataSource経由でバインドした方が扱いやすいかもしれませんよ
DataSource経由なら DataSetやDataAdapterなどもウィザードで生成されますし
Tableについても型指定されたDataTableの派生クラスが生成されます

VBに付属のMSDNなどで GridViewのページの中のリンクを参照してみてください

この回答への補足

redfox63さま
ご回答ありがとうございます。

SQLDataSource経由でバインドしても行の挿入や行の移動は可能なんですね。
そもそもそこに認識の誤りがあったようです。
SQLDataSource経由でバインドした場合には行の挿入などはできないと思っていました。

行の挿入や追加、移動はDataSetを取得してGridViewのDataSouceに
変更後のDataSetを再設定しDataBaindを行えば実現可能なのでしょうか。

MSDNのGridViewのページも確認してみます。
ありがとうございます。

補足日時:2009/03/24 17:43
    • good
    • 0

GridViewがバインド無しのデータを扱えるようになっていなさそうです



データの並び順じたいはユーザー側でどの列を基準に並び替えるかを
SQLで指示するなり
取得したDataSetから新たにDatTableを派生させるなりしてやればいいように思います

SQLなら Order By 句などで指示する

DataSetからなら
dim tbl as DataTable = ds.Tables(0).Clone
tbl.columns.add("MyOrder", System.Type.GetType("System.Int32"))
for each r as DataRow in ds.Tables(0).rows
  dim row as DataRow = tbl.NewRow
  for n as Integer = 0 to tbl.Columns.Count - 2
    row(n) = r(n)
  next
  row("myOrder", ds.Tables(0).rows.Count - tbl.rows.count )
  tbl.rows.add( row )
next

GridView1.DataSource = new DataView( tbl, "", "myOrder", Data.DataViewRowState.CurrentRows)
GridView1.DataBind()
といった具合で出来るかと ...

この回答への補足

redfox63さまご回答ありがとうございます。

>GridViewがバインド無しのデータを扱えるようになっていなさそうです
上記ですが、バインド無しのデータを扱うための設定はどのように行えばよろしいでしょうか?
GridViewからDataSetを取得してバインドする?流れでしょうか?
基本的なことなのかもしれませんがよろしくお願い致します。
データの並び順はSQLのORDER BYで指定する予定です。
(提示したソースにORDER BYがもれていました。失礼致しました。)

またご丁寧にソースまでご提示いただきありがとうございました。
今後の参考にさせていただきます、。

補足日時:2009/03/24 09:54
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A