ASP VB.NET - FindControl не находит мой элемент управления

Немного предыстории. Также есть мастер-страница. Вот код ASPX

<asp:WizardStep ID="WizardStepOrder" runat="server" StepType="Step">
<div>
<p>
Please review the items below and enter the quantity of each item for which you are requesting credit.
</p>
<asp:Label ID="InvoiceItemsInstructionsLabel" runat="server" />
</div>
<div style="padding: 0;">
<asp:GridView ID="InvoiceItemsGridView" runat="server" BorderStyle="None" AutoGenerateColumns="False" Width="100%">
<Columns>
<asp:BoundField DataField="Make" HeaderText="Make" />
<asp:BoundField DataField="PartNumber" HeaderText="Part Number" />
<asp:BoundField DataField="Description" HeaderText="Description" />
<asp:BoundField DataField="Ordered" HeaderText="Ordered" />
<asp:BoundField DataField="Shipped" HeaderText="Shipped" />
<asp:TemplateField HeaderText="Credit Code">
<ItemTemplate>
<asp:DropDownList ID="ddlCreditCode" runat="server" AutoPostBack="true">
<asp:ListItem Text="--Select Value--" Value=""></asp:ListItem>
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>

Также мой vb за кодом

Dim ddlCreditCode As DropDownList = DirectCast(Me.WizardStepOrder.FindControl("ddlCreditCode"), DropDownList)
Dim sql As String
Dim cnn As SqlConnection
Dim cmd As SqlCommand
sql = String.Format("select CreditCode, CreditCodeDescription from myDatabase..CreditCodes")
cnn = DBConnection.GetNamedConnection(NamedConnection.myDatabase)
cmd = New SqlCommand(sql, cnn)
Try
cnn.Open()
ddlCreditCode.DataSource = cmd.ExecuteReader()
ddlCreditCode.DataTextField = "CreditCodeDescription"
ddlCreditCode.DataValueField = "CreditCode"
ddlCreditCode.DataBind()
Catch ex As Exception
Throw ex
Finally
cnn.Close()
cnn.Dispose()
End Try

ddlCreditCode возвращается как ничто. Зачем? Я пытаюсь заполнить раскрывающийся список на моей странице asp значениями из базы данных. Но для этого мне нужно найти этот контроль. Я читал о проблеме, заключающейся в том, что, поскольку существует главная страница, я должен использовать contentplaceholder и использовать findcontrol для этого, а затем использовать findcontrol для этого заполнителя, но это тоже не работает. Я думаю, это связано либо с шаблоном элемента, либо с представлением сетки. Мне нужно пройти через сетку или что-то в этом роде?


person user3542850    schedule 30.04.2014    source источник
comment
row GridViewRow? Если да, то как вы это получите? Кроме того, где вообще находится код?   -  person Tim Schmelter    schedule 30.04.2014
comment
да, строка - это строка просмотра сетки. извините, я забыл включить мой оператор foreach прямо выше. Я считаю, что причина, по которой он не может найти свойство id, потому что оно находится внутри шаблона элемента?   -  person user3542850    schedule 30.04.2014


Ответы (3)


Вы этого не делаете. Измените свой код вот так

Try
//prevent issue on connection already open for some reason
if cnn.state=Closed then cnn.open
//declare a sqldataadpter
dim da as SqlDataAdapter(cmd)
//declare Dataset
dim ds as new Dataset
//fill dataset
da.Fill(ds)
ddlCreditCode.DataSource =ds.table(0)
ddlCreditCode.DataTextField = "CreditCodeDescription"
ddlCreditCode.DataValueField = "CreditCode"
ddlCreditCode.DataBind()
Catch ex As Exception
Throw ex
Finally
cnn.Close()
cnn.Dispose()

Также я лично предлагаю использовать оператор Using, чтобы сам уничтожить ссылки :)

если это сработает, отметьте свой ответ как ответ

person makemoney2010    schedule 30.04.2014
comment
проблема в том, что findcontrol не пытается найти мой раскрывающийся список. это основная проблема, с которой я столкнулся. - person user3542850; 30.04.2014

Я не могу сказать по вашему коду, является ли ddlCreditCode дочерним элементом или сестрой WizardStepOrder (без закрывающего тега). Если это не прямой потомок, Me.WizardStepOrder.FindControl() не найдет его. Согласно MSDN:

Этот метод найдет элемент управления, только если элемент управления содержится непосредственно в указанном контейнере; то есть метод не выполняет поиск в иерархии элементов управления внутри элементов управления.

person nunzabar    schedule 30.04.2014

Вам необходимо использовать событие RowDataBound для заполнения элементов управления в вашем GridView.

Protected Sub OnRowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)

   If (e.Row.RowType = DataControlRowType.DataRow) Then

     'Find the DropDownList in the Row
     Dim ddlCreditCode As DropDownList = CType(e.Row.FindControl("ddlCreditCode"), DropDownList)
     ddlCreditCode.DataSource =ds.table(0)
     ddlCreditCode.DataTextField = "CreditCodeDescription"
     ddlCreditCode.DataValueField = "CreditCode"
     ddlCreditCode.DataBind()


   End If
End Sub
person Rick S    schedule 30.04.2014