DataGridのDropDownListにDataTableを連結するには?

解決


asp.net初心者  2006-05-19 23:12:21  No: 131487

お世話になります。
ASP.netを始めて1ヶ月ぐらいのものです。
VS2003、ASP.netでの質問です。
どなたかご教授お願いします。

DataGridにTemplateを配置し、
Edit時にDropDownListから値を選択できるようにしたいです。

DropDownListで表示するデータが
DataTableに格納されている場合、
どこに、どんなコードを書けば希望の処理ができるように
なるのでしょうか?


なおこ(・∀・)  URL  2006-05-20 03:09:22  No: 131488

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


asp.net初心者  2006-05-20 03:38:30  No: 131489

なおこさま
レスをありがとうございました。
コードまで示していただいたのですが、
リスト項目を動的に追加するのではなく、
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がある場合、
どうしたらいいのかわかりません。


なおこ(・∀・)  URL  2006-05-20 04:20:56  No: 131490

お世話になります。

> リスト項目を動的に追加するのではなく
この反対は、
http://www.microsoft.com/japan/msdn/vs/WebApplication/vbtchtopquestionsaboutaspnetdatagridservercontrol.asp
の 静的な項目 にあたる方法であると思います。

そうではなくて、DataSet や DataTable を使って
"動的"に表示したいのではないのですか?

> DataSetがなく、DataTableがある場合、
> どうしたらいいのかわかりません。

前の投稿では、DataSet は使用していません。
DataTable のみです。


asp.net初心者  2006-05-22 18:36:15  No: 131491

なおこさま
おっしゃるとおりです。
はやとちりしました。ごめんなさい。

そもそも書いていただいたような感じのソースを記述していたのですが、
連結されないのです。

記述していただいたソースをもう一度よく読んで、
どこが違うのか確認してみます。
ありがとうございました。


asp.net初心者  2006-05-22 20:53:48  No: 131492

なおこ(・∀・) さま

連結できました!

Dim itm As DataGridItem
を記述してませんでした。

しかし、データベースのデータを初期値として表示するところが
まだうまくいきません。
もう少し、検討して解決しなければ、別途ポストします。

ありがとうございました。


asp.net初心者  2006-05-22 20:55:27  No: 131493

解決しました


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加