Vb.net 在ControlParameter中找不到控件

Vb.net 在ControlParameter中找不到控件,vb.net,detailsview,findcontrol,hiddenfield,Vb.net,Detailsview,Findcontrol,Hiddenfield,我的页面有一个DetailsView,其中有一个隐藏字段,SQLDataSource引用该字段来填充同一DetailsView中的不同字段。无论我尝试了多少种不同的方法,我都无法通过代码隐藏找到控件。我确实需要能够显示与dsPicklistSqlDataSource关联的TEXT字段。我已标记导致问题的代码。如果您能帮助我展示这些信息,我将不胜感激 <asp:Label ID="Label1" runat="server" Text="Select Survey:"></asp

我的页面有一个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

**
**
挑选名单
正文
挑选名单
正文
单选(单选按钮)
多选(复选框)
文本(文本框)
单选(单选按钮)
多选(复选框)
文本(文本框)
****
受保护的子dvSurveyQuestions_ItemInserting(ByVal sender作为对象,ByVal e作为System.Web.UI.WebControl.DetailsViewSertevenTargs)处理dvSurveyQuestions.ItemInserting
'DetailsView不包括SurveyID列…我们需要在插入操作期间设置此列,因为每个问题都必须属于某个调查。
e、 值(“SurveyID”)=下拉列表1.SelectedValue
端接头
受保护的子dvSurveyQuestions_项目更新(ByVal sender作为对象,ByVal e作为System.Web.UI.WebControl.DetailsViewUpdateEventArgs)处理dvSurveyQuestions.ItemUpdate
'DetailsView不包括SurveyID列…我们需要在更新操作期间设置此列,因为每个问题都必须属于某个调查。
e、 NewValues(“SurveyID”)=DropDownList1.SelectedValue
端接头
受保护的子dvSurveyQuestions_数据绑定(ByVal sender作为对象,ByVal e作为System.EventArgs)处理dvSurveyQuestions.DataBound
'事件处理程序检查DetailsView控件的行数。如果为零,则使用ChangeMode()方法将DetailsView的模式更改为Insert。
如果dvSurveyQuestions.Rows.Count=0,则
dvSurveyQuestions.ChangeMode(DetailsViewMode.Insert)
如果结束
如果dvSurveyQuestions.CurrentMode=DetailsViewMode.[ReadOnly],则
Dim txtName As TextBox=DirectCast(Page.Form.FindControl(“dvSurveyQuestions:hiddenQuestionID”),文本框)
如果结束
端接头
末级
试试这个:

Dim txtName = DirectCast(dvSurveyQuestions.FindControl("hiddenQuestionID"), TextBox) 
因为文本框的NamingContainer是Details视图,而不是页面。请尝试以下操作:

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

因为文本框的NamingContainer是Details视图而不是页面。

我发现这个链接有助于解决没有服务器端的问题:

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

例:

dvSurveyQuestions$hiddenQuestionID


将获取hiddenQuestionID的值,该值是dvSurveyQuestions的内部控件

我发现此链接有助于解决无需服务器端的问题:

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

例:

dvSurveyQuestions$hiddenQuestionID


将获取作为dvSurveyQuestions的内部控件的hiddenQuestionID的值

根据您的建议,我将
Dim txtName替换为TextBox=DirectCast(Page.Form.FindControl(“dvSurveyQuestions:hiddenQuestionID”),TextBox)
,但我仍然得到相同的错误。还有什么我应该添加的代码吗?@jlg:我不知道。你会犯什么错误?在哪里?你调试代码了吗?在此行设置一个断点,然后使用
FindControl
在ControlParameter“QuestionID”中找不到控件“hiddenQuestionID”。
我尝试的另一个选项是将数据源放在detailsview的模板中,但这会导致另一个错误,即HiddenField没有SelectedValue。我通过将SelectedValue更改为Value来更正它,现在我将
无法将“System.Web.UI.WebControls.HiddenField”类型的对象强制转换为“System.Web.UI.WebControls.TextBox”。
我将您提供的代码从TextBox更改为HiddenField,并显示了我的项目符号列表。没有更多的错误
Dim QuestionID=DirectCast(dvSurveyQuestions.FindControl(“hiddenQuestionID”),HiddenField)
我永远不会使用这些XYZ数据源控件的原因之一,因为您失去了控制,在后台发生的事情太多了。最后一次尝试:
ControlID=“dvSurveyQuestions$hiddenQuestionID”
。但即使它起作用,那也只是摆弄而已。编辑:很高兴听到它能工作,原因似乎是Hiddenfield不是服务器控件,因此ASP.NET没有客户端id。根据您的建议,我将
Dim txtName替换为TextBox=DirectCast(Page.Form.FindControl(“dvSurveyQuestions:HiddenQuestion”),TextBox)
。还有什么我应该添加的代码吗?@jlg:我不知道。你会犯什么错误?在哪里?你调试代码了吗?在这条线上设置一个断点,并在w附近进行试验