Добавление DataBound DropDownList в DataGrid - PullRequest
0 голосов
/ 19 января 2012

У меня есть DataGrid, привязанный к DataView, который, помимо других столбцов, имеет столбец идентификатора и столбец ParentID, мне нужно, чтобы пользователь мог указать ParentID, используя DropDownList (ComboBox).

Теперь я уже добавил DropDownList в DataGrid следующим образом:

<Columns>
    [...]
    <asp:TemplateColumn HeaderText="Parent" >
        <ItemTemplate>
            <asp:DropDownList ID="ddlParentID" 
                              runat="server" 
                              DataValueField="ID"
                              DataTextField="Short_Description"
                              Width="100%"
                              DataSource="<%# dsDV %> ">
            </asp:DropDownList>
        </ItemTemplate>
    </asp:TemplateColumn>
</Columns>

В программном коде у меня есть следующий метод:

Protected dsDV As New DataView
Protected Sub PopulateDropDownList()
    Dim conn As SqlClient.SqlConnection = New SqlClient.SqlConnection(myConnString)
    Dim comm As SqlClient.SqlCommand = New SqlClient.SqlCommand("SELECT * FROM myTable", conn)
    comm.CommandType = CommandType.Text
    Dim myTableTable As New DataTable
    conn.Open()

    myTableTable.Load(comm.ExecuteReader)
    Me.dsDV = myTableTable.DefaultView
End Sub

То, что PopulateDropDownMethod вызывается в форме Load Event, но, хотя DDL действительно показывают, они показывают пустыми, как будто не делается DataBinding.

Как правильно связать DDL с источником данных в коде позади?Или, если это не проблема, как мне правильно заполнить DDL?

Обновление 1

После первого ответа я продолжил и попробовал это (все еще не повезло):

Protected Sub dg_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles dgData.ItemDataBound
    If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
        Dim ddl As DropDownList = CType(e.Item.Cells(3).FindControl("ddlParentID"), DropDownList)
        Me.PopulateDropDownList(ddl)
    End If
End Sub

Protected dsDV As New DataView
Protected Sub PopulateDropDownList(ddl As DropDownList)
    Dim conn As SqlClient.SqlConnection = New SqlClient.SqlConnection(myConnString)
    Dim comm As SqlClient.SqlCommand = New SqlClient.SqlCommand("SELECT * FROM myTable", conn)
    comm.CommandType = CommandType.Text
    Dim myTableTable As New DataTable
    conn.Open()

    myTableTable.Load(comm.ExecuteReader)
    ddl.DataSource = myTableTable.DefaultView
    ddl.DataBind()
End Sub

Обратите внимание, что я также удалил вызовPopulateDropDownList из обработчика событий загрузки формы.

Ответы [ 2 ]

0 голосов
/ 22 января 2012

Я не знаю, почему, но перенос кода привязки из aspx в aspx.vb устранил проблему, так что теперь все выглядит так:

<asp:TemplateColumn HeaderText="Parent" >
    <ItemTemplate>
        <asp:DropDownList ID="ddlParentID" runat="server" Width="100%" >
        </asp:DropDownList>
    </ItemTemplate>
</asp:TemplateColumn>

И для кода длякаждый ряд:

Dim ddl As DropDownList = CType(e.Item.Cells(3).FindControl("ddlParentID"), DropDownList)
ddl.DataValueField = "ID"
ddl.DataTextField = "Short_Description"
ddl.DataSource = myTable.DefaultView
ddl.DataBind()
0 голосов
/ 19 января 2012

вы можете попытаться вызвать ddlParent.DataBind () после установки источника данных.

...