【问题标题】:ASP VB.NET - FindControl isn't finding my controlASP VB.NET - FindControl 没有找到我的控件
【发布时间】:2014-04-30 15:58:16
【问题描述】:

一点背景。还有一个母版页。这是 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,但这也不起作用。我认为它与 itemtemplate 或 gridview 有关。我必须遍历 gridview 吗?

【问题讨论】:

  • rowGridViewRow 吗?如果是这样,你如何得到它?另外,代码到底在哪里?
  • 是的行是一个gridviewrow。抱歉,我忘了在上面包含我的 foreach 语句。我相信它找不到 id 属性的原因是因为它在 itemtemplate 中?

标签: asp.net vb.net findcontrol


【解决方案1】:

你不这样做。像这样更改你的代码

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()

我还亲自邀请使用 o 使用 Using 语句,并小心销毁引用主题:)

如果有效,请将您的答案标记为已回答

【讨论】:

  • 问题是 findcontrol 无法找到我的下拉列表。这是我遇到的主要问题。
【解决方案2】:

我无法从您的代码中判断ddlCreditCode 是否是WizardStepOrder 的子代或兄弟姐妹(没有结束标签)。如果不是直子,Me.WizardStepOrder.FindControl() 将找不到。每MSDN

只有当控件直接包含在指定容器中时,该方法才会找到控件;也就是说,该方法不会在控件内的控件层次结构中进行搜索。

【讨论】:

    【解决方案3】:

    您需要使用 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
    

    【讨论】:

      猜你喜欢
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 1970-01-01
      • 2010-12-10
      相关资源
      最近更新 更多