2

我有一个简单的 GridView(ID 为“GridViewAttribs”),它显示数据库中的一些值。

在我的 GridViewAttribs 中,我希望有一个(嵌套?)ListView,但由于某种原因,我不能使用 asp:ControlParameter ControlID="GridViewAttribs" PropertyName,因为在我的(嵌套)ListView 中没有返回任何结果。

如果我不使用 ControlParameter 并对 ListView 的 SELECT 语句进行硬编码,一切都会按预期工作。

这是我的代码:

<asp:SqlDataSource ID="SqlDataSourceAttribHeadings" runat="server" 
    ConnectionString="<%$ ConnectionStrings:customer_support_devConnectionString %>" 
    ProviderName="<%$ ConnectionStrings:customer_support_devConnectionString.ProviderName %>" 
    SelectCommand="SELECT equipment_attrib_heading_id, equipment_model_id, equipment_attrib_name FROM equipment_new_attrib_headings WHERE (equipment_model_id = @equipment_model_id) AND (equipment_attrib_heading_deleted = 0) ORDER BY equipment_attrib_name">
    <SelectParameters>
        <asp:SessionParameter DefaultValue="" Name="equipment_model_id" 
            SessionField="EquipmentModelID" Type="Int32" />
    </SelectParameters>
</asp:SqlDataSource>

<asp:GridView ID="GridViewAttribs" runat="server" AutoGenerateColumns="False" 
    CellPadding="4" DataKeyNames="equipment_attrib_heading_id" 
    DataSourceID="SqlDataSourceAttribHeadings" ForeColor="#333333" GridLines="None" 
    style="margin-right: 0px">
    <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
    <Columns>
        <asp:BoundField DataField="equipment_attrib_heading_id" 
            HeaderText="equipment_attrib_heading_id" ReadOnly="True" 
            SortExpression="equipment_attrib_heading_id" />
        <asp:BoundField DataField="equipment_model_id" HeaderText="equipment_model_id" 
            SortExpression="equipment_model_id" />
        <asp:BoundField DataField="equipment_attrib_name" 
            HeaderText="equipment_attrib_name" SortExpression="equipment_attrib_name" />

        <asp:TemplateField HeaderText="equipment_attrib_value_details" SortExpression="equipment_attrib_value_details">
            <ItemTemplate>

                <asp:SqlDataSource ID="SqlDataSourceAttribValues" runat="server" 
                    ConnectionString="<%$ ConnectionStrings:customer_support_devConnectionString %>" 
                    ProviderName="<%$ ConnectionStrings:customer_support_devConnectionString.ProviderName %>" 
                    SelectCommand="SELECT [equipment_attrib_value_details] FROM [equipment_new_attrib_values] WHERE (equipment_attrib_heading_id = @head_id) AND (equipment_id = @equipment_id) AND (equipment_attrib_value_deleted = 0)">
                    <SelectParameters>
                        <asp:QueryStringParameter Name="equipment_id" QueryStringField="id" 
                            Type="Int32" />
                        <asp:ControlParameter ControlID="GridViewAttribs" 
                            Name="head_id" PropertyName="SelectedDataKey.Values[equipment_attrib_heading_id]" Type="Int32" />
                    </SelectParameters>
                </asp:SqlDataSource>

                <asp:ListView ID="ListViewAttribValues" runat="server" 
                    DataSourceID="SqlDataSourceAttribValues">
                    <EmptyDataTemplate>
                        <table runat="server" style="">
                            <tr><td>No data was returned.</td></tr>
                        </table>
                    </EmptyDataTemplate>
                    <ItemTemplate>
                        <tr style="">
                            <td><asp:Label ID="equipment_attrib_value_detailsLabel" runat="server" Text='<%# Eval("equipment_attrib_value_details") %>' /></td>
                        </tr>
                    </ItemTemplate>
                    <LayoutTemplate>
                        <table ID="itemPlaceholderContainer" runat="server" border="0" style="">
                            <tr ID="itemPlaceholder" runat="server">
                            </tr>
                        </table>
                    </LayoutTemplate>
                </asp:ListView>

            </ItemTemplate>
        </asp:TemplateField>


    </Columns>

</asp:GridView>

GridView 显示所有列都很好,除了我得到“没有返回数据”的“equipment_attrib_value_details”列。

但是,如果我取出调用 @head_id 的 asp:ControlParameter 并使用这个硬编码的 SELECT 语句,那么我会看到正确的(尽管是硬编码的)值:

SelectCommand="SELECT [equipment_attrib_value_details] FROM [equipment_new_attrib_values] WHERE (equipment_attrib_heading_id = 3) AND (equipment_id = @equipment_id) AND (equipment_attrib_value_deleted = 0)">

因此,由于某种原因,“equipment_attrib_heading_id”的 GridViewAttribs 值似乎没有被传递给嵌套的 asp:ControlParameter。

如果没有机会,我也尝试过替换:

PropertyName="SelectedDataKey.Values[equipment_attrib_heading_id]"

和:

PropertyName="SelectedValue"

但这也没有解决问题,仍然没有返回数据。

如果有帮助,我将使用带有 ASP.NET4 (vb) 的 Visual Studio 2010。

4

2 回答 2

1

您可以尝试使用隐藏字段并将该控件用于控制参数

<asp:TemplateField HeaderText="equipment_attrib_value_details" SortExpression="equipment_attrib_value_details">
                    <ItemTemplate>
                         <asp:HiddenField runat="server" ID="heading_id" Value='<%# Eval("equipment_attrib_heading_id") %>' />
                        <asp:SqlDataSource ID="SqlDataSourceAttribValues" runat="server" 
                            ConnectionString="<%$ ConnectionStrings:customer_support_devConnectionString %>" 
                            ProviderName="<%$ ConnectionStrings:customer_support_devConnectionString.ProviderName %>" 
                            SelectCommand="SELECT [equipment_attrib_value_details] FROM [equipment_new_attrib_values] WHERE (equipment_attrib_heading_id = @head_id) AND (equipment_id = @equipment_id) AND (equipment_attrib_value_deleted = 0)">
                            <SelectParameters>
                                <asp:QueryStringParameter Name="equipment_id" QueryStringField="id" Type="Int32" />
                                <asp:ControlParameter ControlID="heading_id" Name="head_id" PropertyName="Value" Type="Int32" />
                            </SelectParameters>
                        </asp:SqlDataSource>

                        <asp:ListView ID="ListViewAttribValues" runat="server" 
                            DataSourceID="SqlDataSourceAttribValues">
                            <EmptyDataTemplate>
                                <table id="Table2" runat="server" style="">
                                    <tr><td>No data was returned.</td></tr>
                                </table>
                            </EmptyDataTemplate>
                            <ItemTemplate>
                                <tr style="">
                                    <td><asp:Label ID="equipment_attrib_value_detailsLabel" runat="server" Text='<%# Eval("equipment_attrib_value_details") %>' /></td>
                                </tr>
                            </ItemTemplate>
                            <LayoutTemplate>
                                <table ID="itemPlaceholderContainer" runat="server" border="0" style="">
                                    <tr ID="itemPlaceholder" runat="server">
                                    </tr>
                                </table>
                 </LayoutTemplate>
         </asp:ListView>
     </ItemTemplate>
</asp:TemplateField>
于 2013-10-02T11:55:05.127 回答
0

这仅适用于(似乎)HiddenField在相同的ItemTemplate. 如果在GridViewDataSource之外的某个地方TemplateField,如果您想要对GridView 的另一列或字段上的控件进行数据填充,那么HiddenField它将不起作用,因为它在技术上是隐藏的。

克服这个问题的方法是代码隐藏。这是我的做法...

我有一个TemplateField指的是@StudentID,它实际上是HiddenField另一个TemplateField中的一个。

        <asp:TemplateField HeaderText="Currently&lt;br/&gt;Tracking&lt;br/&gt;(past weeks)">
            <ItemTemplate>
                <asp:CheckBoxList ID="listWeeksTracking" runat="server" DataSourceID="sdsTETpastWeeks" DataTextField="WeekNo" DataValueField="WeekNo" 
                    OnDataBound="listWeeksTracking_DataBound" OnDataBinding="listWeeksTracking_DataBinding"></asp:CheckBoxList>
                    <br />
                <asp:SqlDataSource ID="sdsTETpastWeeks" runat="server" ConnectionString="<%$ ConnectionStrings:ATCNTV1ConnectionString %>"
                    SelectCommand="SELECT tb.WeekNo, ISNULL((SELECT TOP 1 ts.ETRTWtracking FROM tblTETMeetingStudent AS ts INNER JOIN tblTETMeeting AS tm ON tm.TETmeetingID = ts.TETmeetingID AND tm.WeekNo = tb.WeekNo WHERE ts.StudentID = @StudentID),0) AS Tracking FROM tblTETInstructionalTrainingBlocks AS tb WHERE tb.WeekNo <= @WeekNo AND tb.Active = 1 AND tb.YearNum = YEAR(@TETdate) ORDER BY tb.WeekNo">
                    <SelectParameters>
                        <asp:Parameter Name="StudentID" Type="string" />
                        <asp:ControlParameter ControlID="ddlWeekNo" Name="WeekNo" PropertyName="SelectedValue" Type="int16" />
                        <asp:ControlParameter ControlID="lblTETdate" Name="TETdate" Type="DateTime" />
                    </SelectParameters>
                </asp:SqlDataSource>
            </ItemTemplate>
            <ItemStyle HorizontalAlign="Center" />
            <HeaderStyle Wrap="False" />
        </asp:TemplateField>

所以我将@StudentID 参数定义为简单的参数,而不是a ControlParameter,它不能在我的GridView 的其他地方获取隐藏字段。

在代码隐藏 (C#) 中,我通过DataBinding捕获 Selecting 事件。在那里,我专门查找与我刚刚填充(或即将填充)的控件相关的行,然后查找 HiddenField。

protected void listWeeksTracking_DataBinding(object sender, EventArgs e)
{
    //set the parameter for the StudentID here as using hiddenfields does not work directly in asp.net, as they are hidden!
    CheckBoxList cbl1 = (CheckBoxList)sender;
    GridViewRow gvRow = (GridViewRow)cbl1.NamingContainer;
    if (gvRow != null)
    {
        SqlDataSource sdsTETpastWeeks = (SqlDataSource)gvRow.FindControl("sdsTETpastWeeks");
        HiddenField hfStudentID = (HiddenField)gvRow.FindControl("hfStudentID");
        if (hfStudentID != null) sdsTETpastWeeks.SelectParameters["StudentID"].DefaultValue = hfStudentID.Value.ToString();
    }
}

瞧!

于 2016-06-07T05:04:58.113 回答