【问题标题】:Is it possible to use a control in a different content tag as a parameter?是否可以将不同内容标签中的控件用作参数?
【发布时间】:2011-04-18 21:17:31
【问题描述】:

我目前有两个 Web 控件,一个是 CheckBoxList,另一个是 GridView。 GridView 的数据配置在其查询中有一个参数,该参数链接到 CheckBoxList 中的选定值。但是,当两个控件位于单独的内容标签中时,如下所示:

<asp:Content ID="ListPanel" runat="server" ContentPlaceHolderID="LeftContent">
    <h3>Pick Info Here</h3>
    <asp:CheckBoxList ID="cbList1" runat="server" 
        DataSourceID="TestDataSource" 
        DataTextField="St" DataValueField="St" RepeatColumns="2">
    </asp:CheckBoxList>
</asp:Content>

<asp:Content ID="ResultsPanel" runat="server" ContentPlaceHolderID="RightContent">
    <asp:GridView ID="gView1" runat="server" 
        AllowPaging="True" AllowSorting="True" 
        AutoGenerateColumns="False" DataSourceID="TestDS1">
        <Columns>
         ... 
        </Columns>
    </asp:GridView>
    <asp:SqlDataSource ID="TestDS1" runat="server" 
    ... 
    SelectCommand="SELECT ST FROM [Table] where ST = ?">
    <SelectParameters>
        <asp:ControlParameter ControlID="cbList1" Name="?" 
            PropertyName="SelectedValue" />
    </SelectParameters>
</asp:SqlDataSource>
</asp:Content>

当我将两个控件放在同一个 &lt;asp:Content&gt; 标记中时,它工作正常,但是由于 System.InvalidOperationException: Could not find control 'cbList1' in ControlParameter '?' 的错误而发生故障。有没有办法让控件分开,还是必须在同一个内容标签内?

【问题讨论】:

  • 是否有理由将它们放在两个内容面板中?

标签: asp.net html visual-studio-2010


【解决方案1】:

看起来有点古怪,但您可以在 ResultPanel 中放置一个 HiddenControl,然后在页面加载时将其值设置为 cbList1.SelectedValue 的值。

我知道您可以从后面的代码访问控件,无论它们位于什么内容中,但显然您不能从 aspx 端的内容本身中访问。

【讨论】:

  • 这是在运行时从正确的控件中获取值的唯一“万无一失”的方法。依赖或试图强迫 ASP.net 为你做这一切,这很好,但并不总是有效,因为浏览器、DOM 等 - 谁知道!
【解决方案2】:

显然,这可以通过在参数条目的ControlID 前加上前缀ContentPlaceHolderID 来完成。就我而言,代码是:

SelectParameters>
        <asp:ControlParameter ControlID="LeftContent:cbList1" Name="?" 
            PropertyName="SelectedValue" />
    </SelectParameters>  

因为参数读取的 Control 位于 LeftContent 标记中。

【讨论】:

    【解决方案3】:

    几年后......我在网格视图和控制参数方面遇到了同样的问题。在呈现页面的源代码中,您可以找到元素的确切“路径”。就我而言,不仅是gv1$txtEmployeeName,还有gv1$ctl02$txtEmplyeeName

    我猜,ctl02 表示EditItemTemplate,因为包含ctl02$ 解决了我的问题。

    【讨论】:

      猜你喜欢
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      • 2020-01-10
      • 2018-05-30
      相关资源
      最近更新 更多