【问题标题】:Could not find control in ControlParameter在 ControlParameter 中找不到控件
【发布时间】:2012-01-31 22:38:16
【问题描述】:

我的页面有一个DetailsView,其中有一个隐藏字段,SQLDataSource 引用该字段以填充同一DetailsView 中的不同字段。无论我尝试了多少不同的方法,我都无法通过代码隐藏找到控件。我真的需要能够显示与dsPicklist SqlDataSource 关联的TEXT 字段。我已经标记了导致问题的代码。在尝试显示此信息时,我非常感谢一些帮助。

<asp:Label ID="Label1" runat="server" Text="Select Survey:"></asp:Label>

<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True"
    DataSourceID="dsSurvey" DataTextField="SurveyName" DataValueField="SurveyID">
</asp:DropDownList>

<asp:DetailsView ID="dvSurveyQuestions" runat="server" AllowPaging="True" 
AutoGenerateRows="False" CellPadding="4" DataKeyNames="QuestionID" 
DataSourceID="dsSurveyQuestions" ForeColor="#333333" GridLines="None" Height="50px" 
Width="100%">
<Fields>
    <asp:BoundField DataField="QuestionNum" HeaderText="Question Number" 
        SortExpression="QuestionNum" />

    **<asp:TemplateField>
        <ItemTemplate>
            <asp:HiddenField ID="hiddenQuestionID" runat="server" 
            Value='<%# Bind("QuestionID") %>'>
            </asp:HiddenField>
        </ItemTemplate>
    </asp:TemplateField>**

    <asp:TemplateField HeaderText="Question Type" SortExpression="QType">
        <EditItemTemplate>
            <asp:DropDownList ID="DropDownList4" runat="server" 
                SelectedValue='<%# Bind("QType") %>'>
                <asp:ListItem Value="Picklist">Picklist</asp:ListItem>
                <asp:ListItem Value="Text">Text</asp:ListItem>
            </asp:DropDownList>
        </EditItemTemplate>
        <InsertItemTemplate>
            <asp:DropDownList ID="DropDownList5" runat="server" 
                SelectedValue='<%# Bind("QType") %>'>
                <asp:ListItem Value="Picklist">Picklist</asp:ListItem>
                <asp:ListItem Value="Text">Text</asp:ListItem>
            </asp:DropDownList>
        </InsertItemTemplate>
        <ItemTemplate>
            <asp:Label ID="lblQType" runat="server" Text='<%# Bind("QType") %>'>
            </asp:Label>
        </ItemTemplate>
    </asp:TemplateField>

    <asp:TemplateField HeaderText="Question" SortExpression="Question">
        <EditItemTemplate>
            <asp:TextBox ID="TextBox1" runat="server" TextMode="MultiLine" 
            Text='<%# Bind("Question") %>'>
            </asp:TextBox>
        </EditItemTemplate>
        <InsertItemTemplate>
            <asp:TextBox ID="TextBox1" runat="server" TextMode="MultiLine" 
            Text='<%# Bind("Question") %>'>
            </asp:TextBox>
        </InsertItemTemplate>
        <ItemTemplate>
            <asp:Label ID="lblQuestion" runat="server" Text='<%# Bind("Question") %>'>    
            </asp:Label>
        </ItemTemplate>
    </asp:TemplateField>

    <asp:TemplateField HeaderText="Answer" SortExpression="PicklistID">
        <EditItemTemplate>
        <!-- put something here after ItemTemplate testing -->
        </EditItemTemplate>
        <InsertItemTemplate>
        <!-- put something here after ItemTemplate testing -->
        </InsertItemTemplate>
        <ItemTemplate>
            <asp:HiddenField ID="hiddenPicklistID" runat="server"  
            Value='<%# Bind("PicklistID") %>' />
            <asp:BulletedList ID="blText" runat="server" DataSourceID="dsPicklist" 
            DataTextField="TEXT">
            </asp:BulletedList>
        </ItemTemplate>
    </asp:TemplateField>

    <asp:TemplateField HeaderText="Answer Type" SortExpression="AnswerType">
        <EditItemTemplate>
            <asp:DropDownList ID="DropDownList2" runat="server" 
                SelectedValue='<%# Bind("AnswerType") %>'>
                <asp:ListItem Value="S">Single Choice (radio button)</asp:ListItem>
                <asp:ListItem Value="M">Multiple Choices (checkboxes)</asp:ListItem>
                <asp:ListItem Value="T">Text (textbox)</asp:ListItem>
            </asp:DropDownList>
        </EditItemTemplate>
        <InsertItemTemplate>
            <asp:DropDownList ID="DropDownList3" runat="server" 
                SelectedValue='<%# Bind("AnswerType") %>'>
                <asp:ListItem Value="S">Single Choice (radio button)</asp:ListItem>
                <asp:ListItem Value="M">Multiple Choices (checkboxes)</asp:ListItem>
                <asp:ListItem Value="T">Text (textbox)</asp:ListItem>
            </asp:DropDownList>
        </InsertItemTemplate>
        <ItemTemplate>
            <asp:Label ID="lblAnswerType" runat="server" Text='<%# Bind("AnswerType") %>'></asp:Label>
        </ItemTemplate>
    </asp:TemplateField>

    <asp:BoundField DataField="Subsequence" HeaderText="Subsequence" 
        SortExpression="Subsequence" />
    <asp:CheckBoxField DataField="Active" HeaderText="Active" 
            SortExpression="Active" />
    <asp:CheckBoxField DataField="Question_Locked" HeaderText="Question Locked" 
            SortExpression="Question_Locked" />
    <asp:BoundField DataField="QHelp" HeaderText="Question Help" SortExpression="QHelp" />
    <asp:BoundField DataField="Script" HeaderText="Script" 
        SortExpression="Script" />
    <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" 
        ShowInsertButton="True" />
    </Fields>
</asp:DetailsView>
<asp:SqlDataSource ID="dsPicklist" runat="server" 
    ConnectionString="<%$ ConnectionStrings:SurveyConnectionString %>" 
    SelectCommand="SELECT p.TEXT 
                   FROM PICKLIST p 
                   JOIN C_Survey_Questions c 
                   ON p.PICKLISTID = c.PicklistID 
                   AND c.QuestionID = @QuestionID 
                   AND c.SurveyID = @SurveyID 
                   WHERE p.PICKLISTID IS NOT NULL 
                   AND c.PicklistID IS NOT NULL">
    <SelectParameters>
        <asp:ControlParameter ControlID="DropDownList1" Name="SurveyID" 
            PropertyName="SelectedValue" Type="Int32" />
        **<asp:ControlParameter ControlID="hiddenQuestionID" Name="QuestionID" 
            PropertyName="SelectedValue" Type="Int32" />**
    </SelectParameters>
</asp:SqlDataSource>

<asp:SqlDataSource ID="dsSurvey" runat="server" 
    ConnectionString="<%$ ConnectionStrings:SurveyConnectionString %>" 
    SelectCommand="SELECT [SurveyID], [SurveyName] 
                   FROM [C_Survey] 
                   ORDER BY [SurveyName]">
</asp:SqlDataSource>

<asp:SqlDataSource ID="dsSurveyQuestions" runat="server" 
    ConnectionString="<%$ ConnectionStrings:SurveyConnectionString %>" 
    DeleteCommand="DELETE FROM [C_Survey_Questions] WHERE [QuestionID] = @QuestionID" 
    InsertCommand="INSERT INTO [C_Survey_Questions] ([SurveyID], [Question], [QType],
                   [PickListID], [QuestionNum], [Subsequence], [Active], [Script], 
                   [Question_Locked], [QHelp], [Createdate], [Modifydate],
                   [AnswerType]) 
                   VALUES (@SurveyID, @Question, @QType, @PickListID, @QuestionNum, 
                   @Subsequence, @Active, @Script, @Question_Locked, @QHelp, getdate(), 
                   getdate(), @AnswerType)" 
    SelectCommand="SELECT * FROM C_Survey_Questions WHERE SurveyID = @SurveyID" 
    UpdateCommand="UPDATE [C_Survey_Questions] 
                   SET [SurveyID] = @SurveyID, [Question] = @Question,
                   [QType] = @QType, [PickListID] = @PickListID, 
                   [QuestionNum] = @QuestionNum, [Subsequence] = @Subsequence, 
                   [Active] = @Active, [Script] = @Script, 
                   [Question_Locked] = @Question_Locked, 
                   [QHelp] = @QHelp, [Modifydate] = getdate(), 
                   [AnswerType] = @AnswerType WHERE [QuestionID] = @QuestionID">
    <DeleteParameters>
        <asp:Parameter Name="QuestionID" Type="Int32" />
    </DeleteParameters>
    <InsertParameters>
        <asp:Parameter Name="SurveyID" Type="Int32" />
        <asp:Parameter Name="Question" Type="String" />
        <asp:Parameter Name="QType" Type="String" />
        <asp:Parameter Name="PickListID" Type="String" />
        <asp:Parameter Name="QuestionNum" Type="Int32" />
        <asp:Parameter Name="Subsequence" Type="Int32" />
        <asp:Parameter Name="Active" Type="Boolean" />
        <asp:Parameter Name="Script" Type="String" />
        <asp:Parameter Name="Question_Locked" Type="Boolean" />
        <asp:Parameter Name="QHelp" Type="String" />
        <asp:Parameter Name="Createdate" Type="DateTime" />
        <asp:Parameter Name="Modifydate" Type="DateTime" />
        <asp:Parameter Name="AnswerType" Type="String" />
    </InsertParameters>
    <SelectParameters>
        <asp:ControlParameter ControlID="DropDownList1" Name="SurveyID" 
            PropertyName="SelectedValue" Type="Int32" />
    </SelectParameters>
    <UpdateParameters>
        <asp:Parameter Name="SurveyID" Type="Int32" />
        <asp:Parameter Name="Question" Type="String" />
        <asp:Parameter Name="QType" Type="String" />
        <asp:Parameter Name="PickListID" Type="String" />
        <asp:Parameter Name="QuestionNum" Type="Int32" />
        <asp:Parameter Name="Subsequence" Type="Int32" />
        <asp:Parameter Name="Active" Type="Boolean" />
        <asp:Parameter Name="Script" Type="String" />
        <asp:Parameter Name="Question_Locked" Type="Boolean" />
        <asp:Parameter Name="QHelp" Type="String" />
        <asp:Parameter Name="Modifydate" Type="DateTime" />
        <asp:Parameter Name="AnswerType" Type="String" />
    </UpdateParameters>
</asp:SqlDataSource>




Protected Sub dvSurveyQuestions_ItemInserting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewInsertEventArgs) Handles dvSurveyQuestions.ItemInserting
    'The DetailsView does not include SurveyID column...we need to set this column during INSERT operations because each question must belong to some survey.
    e.Values("SurveyID") = DropDownList1.SelectedValue
End Sub
Protected Sub dvSurveyQuestions_ItemUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewUpdateEventArgs) Handles dvSurveyQuestions.ItemUpdating
    'The DetailsView does not include SurveyID column...we need to set this column during UPDATE operations because each question must belong to some survey.
    e.NewValues("SurveyID") = DropDownList1.SelectedValue
End Sub
Protected Sub dvSurveyQuestions_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles dvSurveyQuestions.DataBound
    'The event handler checks the row count of the DetailsView control. If it is zero then the mode of the DetailsView is changed to Insert using ChangeMode() method.
    If dvSurveyQuestions.Rows.Count = 0 Then
        dvSurveyQuestions.ChangeMode(DetailsViewMode.Insert)
    End If
    If dvSurveyQuestions.CurrentMode = DetailsViewMode.[ReadOnly] Then
        Dim txtName As TextBox = DirectCast(Page.Form.FindControl("dvSurveyQuestions:hiddenQuestionID"), TextBox)
    End If
End Sub
End Class

【问题讨论】:

    标签: vb.net detailsview findcontrol hiddenfield


    【解决方案1】:

    我发现此链接有助于在没有服务器端的情况下解决:Solving the error "Could not find control 'xxx' in ControlParameter 'xxx'."

    作者说可以使用美元字符($)来访问内部控件。

    例如:

    dvSurveyQuestions$hiddenQuestionID

    将获得 hiddenQuestionID 的值,它是 dvSurveyQuestions 的内部控件

    【讨论】:

    • @jlg 好的,小晚汉! ;) 大声笑
    【解决方案2】:

    试试这个:

    Dim txtName = DirectCast(dvSurveyQuestions.FindControl("hiddenQuestionID"), TextBox) 
    

    由于 TextBox 的 NamingContainer 是 DetailsView 而不是 Page。

    【讨论】:

    • 我用你的建议替换了Dim txtName As TextBox = DirectCast(Page.Form.FindControl("dvSurveyQuestions:hiddenQuestionID"), TextBox),但我仍然遇到同样的错误。我还应该在该代码中添加其他内容吗?
    • @jlg:我不知道。你得到什么错误,在哪里?你调试过代码吗?在此行设置断点并使用FindControl 进行实验。
    • Could not find control 'hiddenQuestionID' in ControlParameter 'QuestionID'. 我尝试的另一个选项是将数据源放在我的模板中的详细信息视图中,但这会导致另一个错误,即 HiddenField 没有 SelectedValue。我通过将 SelectedValue 更改为 Value 来更正它,现在我得到 Unable to cast object of type 'System.Web.UI.WebControls.HiddenField' to type 'System.Web.UI.WebControls.TextBox'.
    • 我将您提供的代码从 TextBox 更改为 HiddenField,然后我的项目符号列表出现了。没有更多的错误。 Dim QuestionID = DirectCast(dvSurveyQuestions.FindControl("hiddenQuestionID"), HiddenField)
    • 由于您失去控制,我永远不会使用这些 XYZ-DataSource 控件的原因之一是后台发生的事情太多了。最后一次尝试:ControlID="dvSurveyQuestions$hiddenQuestionID"。但即使它有效,那也是在摆弄。 编辑:很高兴听到它有效,原因似乎是 Hiddenfield 不是服务器控件,因此 ASP.NET 没有客户端 ID。
    猜你喜欢
    • 2014-10-12
    • 2023-03-17
    • 2012-11-16
    • 2012-05-28
    • 2021-12-26
    • 1970-01-01
    • 2016-10-08
    • 2011-09-28
    • 2014-04-10
    相关资源
    最近更新 更多