お世話になります。
ASP.netを始めて1ヶ月ぐらいのものです。
VS2003、ASP.netでの質問です。
どなたかご教授お願いします。
DataGridにTemplateを配置し、
Edit時にDropDownListから値を選択できるようにしたいです。
DropDownListで表示するデータが
DataTableに格納されている場合、
どこに、どんなコードを書けば希望の処理ができるように
なるのでしょうか?
http://www.atmarkit.co.jp/fdotnet/dotnettips/090dropdowndg/dropdowndg.html
を参考にしてやってみました。
■ aspx
...略
<form id="Form1" method="post" runat="server">
<asp:DataGrid id="MyGrid" runat="server" OnEditCommand="MyGrid_Edit" OnUpdateCommand="MyGrid_Update" OnCancelCommand="MyGrid_Cancel"
AutoGenerateColumns="false">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem, "NAME") %>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList id="MyDD" runat="server"></asp:DropDownList>
</EditItemTemplate>
</asp:TemplateColumn>
<asp:EditCommandColumn ButtonType="PushButton" UpdateText="更新" CancelText="キャンセル" EditText="編集"></asp:EditCommandColumn>
</Columns>
</asp:DataGrid>
</form>
...略
■ aspx.vb
Public Class WebForm1
Inherits System.Web.UI.Page
#Region " Web フォーム デザイナで生成されたコード "
...略
#End Region
Private m_source As DataTable
Private m_list As DataTable
Private Function CreateDataTable() As DataTable
Dim dt As DataTable = New DataTable
dt.Columns.Add("ID", GetType(Integer))
dt.Columns.Add("NAME", GetType(String))
dt.Rows.Add(New Object() {1, "aaa"})
dt.Rows.Add(New Object() {2, "bbb"})
dt.Rows.Add(New Object() {3, "ccc"})
dt.Rows.Add(New Object() {4, "ddd"})
Return dt
End Function
Private Function CreateSourceDataTable() As DataTable
Dim dt As DataTable = New DataTable
dt.Columns.Add("ID", GetType(Integer))
dt.Columns.Add("NAME", GetType(String))
dt.Rows.Add(New Object() {2, "bbb"})
dt.Rows.Add(New Object() {4, "ddd"})
dt.Rows.Add(New Object() {3, "ccc"})
dt.Rows.Add(New Object() {1, "aaa"})
Return dt
End Function
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' ページを初期化するユーザー コードをここに挿入します。
If Not IsPostBack Then
Me.m_list = Me.CreateDataTable()
Me.m_source = Me.CreateSourceDataTable()
Session("source") = Me.m_source
Session("list") = Me.m_list
Me.BindMyGrid()
Else
Me.m_source = DirectCast(Session("source"), DataTable)
Me.m_list = DirectCast(Session("list"), DataTable)
End If
End Sub
Protected Sub MyGrid_Edit(ByVal sender As Object, ByVal e As DataGridCommandEventArgs)
Dim index As Integer = e.Item.ItemIndex
Me.MyGrid.EditItemIndex = index
Me.BindMyGrid()
Dim itm As DataGridItem = Me.MyGrid.Items(index)
Dim myList As DropDownList = DirectCast(itm.FindControl("MyDD"), DropDownList)
If myList Is Nothing Then Return
myList.DataSource = Me.m_list
myList.DataTextField = "NAME"
myList.DataValueField = "ID"
myList.DataBind()
myList.SelectedValue = Convert.ToString(Me.m_source.Rows(index)("ID"))
End Sub
Protected Sub MyGrid_Cancel(ByVal sender As Object, ByVal e As DataGridCommandEventArgs)
Me.MyGrid.EditItemIndex = -1
Me.BindMyGrid()
End Sub
Protected Sub MyGrid_Update(ByVal sender As Object, ByVal e As DataGridCommandEventArgs)
Dim myList As DropDownList = DirectCast(e.Item.FindControl("MyDD"), DropDownList)
Me.m_source.Rows(e.Item.ItemIndex)("ID") = myList.SelectedItem.Value
Me.m_source.Rows(e.Item.ItemIndex)("NAME") = myList.SelectedItem.Text
Me.MyGrid.EditItemIndex = -1
Me.BindMyGrid()
End Sub
Private Sub BindMyGrid()
Me.MyGrid.DataSource = Me.m_source
Me.MyGrid.DataBind()
End Sub
End Class
なおこさま
レスをありがとうございました。
コードまで示していただいたのですが、
リスト項目を動的に追加するのではなく、
DataTableにあるものを表示したいのです。
たとえば、msdnで調べると
「DataGrid Web サーバー コントロールについてよく寄せられる質問」
に次のようなものがのっています。
-------------------------
<asp:TemplateColumn HeaderText="ジャンル (データセット)">
<ItemTemplate>
<asp:Label id=Label3 runat="server"
Text='<%# DataBinder.Eval(Container, "DataItem.genre") %>'>
</asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList id=DropDownList4 runat="server"
DataSource="<%# DsBooks1 %>" DataMember="Genre"
DataTextField="genre" DataValueField="genre" Width="160px">
</asp:DropDownList>
</EditItemTemplate>
</asp:TemplateColumn>
-----------------------
ここで、datasourceはDataSetであり、DataTableではありません。
DataSetがなく、DataTableがある場合、
どうしたらいいのかわかりません。
お世話になります。
> リスト項目を動的に追加するのではなく
この反対は、
http://www.microsoft.com/japan/msdn/vs/WebApplication/vbtchtopquestionsaboutaspnetdatagridservercontrol.asp
の 静的な項目 にあたる方法であると思います。
そうではなくて、DataSet や DataTable を使って
"動的"に表示したいのではないのですか?
> DataSetがなく、DataTableがある場合、
> どうしたらいいのかわかりません。
前の投稿では、DataSet は使用していません。
DataTable のみです。
なおこさま
おっしゃるとおりです。
はやとちりしました。ごめんなさい。
そもそも書いていただいたような感じのソースを記述していたのですが、
連結されないのです。
記述していただいたソースをもう一度よく読んで、
どこが違うのか確認してみます。
ありがとうございました。
なおこ(・∀・) さま
連結できました!
Dim itm As DataGridItem
を記述してませんでした。
しかし、データベースのデータを初期値として表示するところが
まだうまくいきません。
もう少し、検討して解決しなければ、別途ポストします。
ありがとうございました。
解決しました
ツイート | ![]() |