【问题标题】:Could not find Control in ControlParameter - prepending with ContentPlaceHolderID not working在 ControlParameter 中找不到控件 - 以 ContentPlaceHolderID 为前缀不起作用
【发布时间】:2013-09-27 18:27:59
【问题描述】:

我遇到了经典的“EditItemTemplate”/“找不到控件”错误,因为我的搜索参数引用了 ControlIDGridView 内的 EditItemTemplate 内。我尝试在我的 ControlID 前面加上 GridView 的 ID (gridview$controlID),但它不起作用。如果必须,我很乐意使用“代码隐藏”方法,但我更愿意理解 为什么 前置方法不起作用。基于以下代码的任何提示?

谢谢!

<asp:UpdatePanel ID="upMatchEntry" ChildrenAsTriggers="false" EnableViewState="false" runat="server" UpdateMode="Conditional">
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="ddlGameWeek" EventName="SelectedIndexChanged" />
    </Triggers>
    <ContentTemplate>
        <asp:GridView ID="gvMatchSelect" DataKeyNames="MatchID,HomeTeamID,AwayTeamID" 
            DataSourceID="sdsMatches" runat="server" AutoGenerateEditButton="True"
            AutoGenerateColumns="False" EmptyDataText="No Matches Found" ContentPlaceHolderID="cpMatchSelect">
            <Columns>
                <asp:TemplateField HeaderText="Home Team" SortExpression="HomeTeamName" ItemStyle-HorizontalAlign="left">
                    <ItemTemplate><%# Eval("HomeTeamName") %></ItemTemplate>
                    <EditItemTemplate>
                        <asp:DropDownList runat="server" ID="ddlHomeTeam" DataSourceID="sdsHomeTeams" 
                            DataTextField="HomeTeamName" DataValueField="HomeTeamID" 
                            SelectedValue='<%# Bind("HomeTeamID") %>' AutoPostBack="True" />
                    </EditItemTemplate>
                    <ItemStyle HorizontalAlign="Left" />
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Away Team" SortExpression="AwayTeamName" ItemStyle-HorizontalAlign="left">
                    <ItemTemplate><%# Eval("AwayTeamName") %></ItemTemplate>
                    <EditItemTemplate>
                        <asp:DropDownList runat="server" ID="ddlAwayTeam" DataSourceID="sdsAwayTeams" 
                            DataTextField="AwayTeamName" DataValueField="AwayTeamID" 
                            SelectedValue='<%# Bind("AwayTeamID") %>' AutoPostBack="True"/>
                    </EditItemTemplate>
                    <ItemStyle HorizontalAlign="Left" />
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="sdsMatches" ConnectionString='<%$ ConnectionStrings:ApplicationServices %>' runat="server" 
            SelectCommand="pGameWeekMatchAdminDisplay" SelectCommandType="StoredProcedure">
            <SelectParameters>
                <asp:ControlParameter Name="GameWeekID" ControlID="ddlGameWeek" PropertyName="SelectedValue" Type="Int32" DefaultValue="-1" />
                <asp:ControlParameter Name="DivisionID" ControlID="ddlDivision" PropertyName="SelectedValue" Type="Int32" DefaultValue="-1" />
            </SelectParameters>
        </asp:SqlDataSource>
        <asp:SqlDataSource ID="sdsHomeTeams" ConnectionString='<%$ ConnectionStrings:ApplicationServices %>' runat="server"
            SelectCommand="SELECT 'Select Home Team' AS HomeTeamName, -1 AS HomeTeamID UNION SELECT Name AS HomeTeamName, TeamID AS HomeTeamID FROM Team WHERE DivisionID = @DivisionID AND TeamID <> @AwayTeamID" >
            <SelectParameters>
                <asp:ControlParameter Name="DivisionID" ControlID="ddlDivision" PropertyName="SelectedValue" Type="Int32" />
                <asp:ControlParameter Name="AwayTeamID" ControlID="gvMatchSelect$ddlAwayTeam" PropertyName="SelectedValue" Type="Int32" />
            </SelectParameters>
        </asp:SqlDataSource>
        <asp:SqlDataSource ID="sdsAwayTeams" ConnectionString='<%$ ConnectionStrings:ApplicationServices %>' runat="server"
            SelectCommand="SELECT 'Select Away Team' AS AwayTeamName, -1 AS AwayTeamID UNION SELECT Name AS AwayTeamName, TeamID AS AwayTeamID FROM Team WHERE DivisionID = @DivisionID AND TeamID <> @HomeTeamID" >
            <SelectParameters>
                <asp:ControlParameter Name="DivisionID" ControlID="ddlDivision" PropertyName="SelectedValue" Type="Int32" />
                <asp:ControlParameter Name="HomeTeamID" ControlID="gvMatchSelect$ddlHomeTeam" PropertyName="SelectedValue" Type="Int32" />
            </SelectParameters>
        </asp:SqlDataSource>
    </ContentTemplate>
</asp:UpdatePanel>

【问题讨论】:

  • SqlDataSource 应该如何知道应该从哪个ddlHomeTeam 获取其参数?
  • 我不确定我是否理解你的问题。这基本上就是我要问的。
  • ddlHomeTeam 可以有多个实例,因为它存在于GridView 中,SqlDataSource 将不知道您引用的是哪一个。您可能需要重新考虑您的设计,或者将 SDS 包含在您的 GridView 中。
  • @LeeCambl 你有没有找到解决办法?我遇到了同样的问题......有人吗?

标签: c# asp.net gridview


【解决方案1】:

控件嵌套在实现INamingContainer 接口的GridViewRow 内。如果您使用的是最新版本的 ASP.NET 并且只需要单行编辑,您应该能够通过将控件 ID 设为静态来解决此问题:

ClientIDMode="Static"

【讨论】:

  • 我现在可能听起来很迂腐,但我实际上并没有要求替代解决方案,我问为什么适用于其他人的“GridViewID$ControlID”方法不不能在上面工作。有什么想法吗?除此之外,使用ClientIDMode="Static" 也不起作用。
猜你喜欢
  • 1970-01-01
  • 2014-10-12
  • 2023-03-17
  • 2012-11-16
  • 2012-05-28
  • 2021-12-26
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
相关资源
最近更新 更多