【问题标题】:Filtering SqlDataSource by gridview cell通过gridview单元过滤SqlDataSource
【发布时间】:2016-08-17 21:09:21
【问题描述】:

我创建了一个简单的.aspx 页面,其中包含一个主网格视图 (GridView1),第二个网格视图 (GridView2) 在第一个的模板字段中。

这些网格视图有 2 个SqlDataSources(SqlDataSource1SqlDataSource2)。

是否可以通过SqlDataSource1(或GridView1)中的值过滤SqlDataDource2(或GridView2)中的行?

我的意思是,对于 GridView1 中的每一行,GridView2 中只有字段 GridView2.PlaceID 和 GridView1.PlaceID 相等的行。 现在我们可以看到 GridView2 中的所有行,以及 GridView1 中的每一行。

代码在这里:

<form id="form1" runat="server">
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:DB Places %>" SelectCommand="SELECT [PlaceID], [Place] FROM [Places]" ProviderName="System.Data.SqlClient">
</asp:SqlDataSource>
<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:DB Devices %>" SelectCommand="SELECT [PlaceID], [DeviceID], [Date] FROM [Devices]"  ProviderName="System.Data.SqlClient">
</asp:SqlDataSource>
<asp:GridView id="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False" DataKeyNames="Код_места" DataSourceID="SqlDataSource1">
    <Columns>
        <asp:BoundField DataField="PlaceID" HeaderText="PlaceID" InsertVisible="False" ReadOnly="True" SortExpression="PlaceID">
        </asp:BoundField>
        <asp:BoundField DataField="Place" HeaderText="Place" SortExpression="Place">
        </asp:BoundField>
        <asp:TemplateField ConvertEmptyStringToNull="False" HeaderText="Devices">
            <ItemTemplate>
                <asp:GridView id="GridView2" runat="server" AllowPaging="True" AutoGenerateColumns="False" DataSourceID="SqlDataSource2">
                    <Columns>
                        <asp:BoundField DataField="PlaceID" HeaderText="PlaceID" SortExpression="PlaceID">
                        </asp:BoundField>
                        <asp:BoundField DataField="DeviceID" HeaderText="DeviceID" ReadOnly="True" SortExpression="DeviceID">
                        </asp:BoundField>
                        <asp:BoundField DataField="Date" HeaderText="Date" SortExpression="Date">
                        </asp:BoundField>
                    </Columns>
                </asp:GridView>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
</form>

提前致谢!

【问题讨论】:

  • 您需要将SqlDataSource2GridView2 一起放入您的TemplateField 并从GridView1 的字段中添加parameter(s)。
  • 你能给我一些代码示例吗?因为知道需要加参数,但是不知道怎么把sqldatasource中的这个参数和gridview单元格值联系起来

标签: asp.net sql-server database


【解决方案1】:

更新

您需要将SqlDataSource2 放在asp:TemplateField 中,并从.cs 代码(GridView1_RowDataBound) 中设置defaultValue。像这样的东西。另请阅读MSDN Walkthrough: Creating a Nested GridView Control

<form id="form1" runat="server">
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:DB Places %>" SelectCommand="SELECT [PlaceID], [Place] FROM [Places]" ProviderName="System.Data.SqlClient">
</asp:SqlDataSource>
<asp:GridView id="GridView1" OnRowDataBound="GridView1_RowDataBound" runat="server" AllowPaging="True" AutoGenerateColumns="False" DataKeyNames="PlaceID" DataSourceID="SqlDataSource1">
    <Columns>
        <asp:BoundField DataField="PlaceID" HeaderText="PlaceID" InsertVisible="False" ReadOnly="True" SortExpression="PlaceID">
        </asp:BoundField>
        <asp:BoundField DataField="Place" HeaderText="Place" SortExpression="Place">
        </asp:BoundField>
        <asp:TemplateField ConvertEmptyStringToNull="False" HeaderText="Devices">
            <ItemTemplate>
<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:DB Devices %>" 
SelectCommand="SELECT [PlaceID], [DeviceID], [Date] FROM [Devices] where PlaceID=@placeid"  ProviderName="System.Data.SqlClient">
   <SelectParameters>
     <asp:Parameter name="placeid" Type="Int32" DefaultValue="" />
</asp:SqlDataSource>
                <asp:GridView id="GridView2" runat="server" AllowPaging="True" AutoGenerateColumns="False" DataSourceID="SqlDataSource2">
                    <Columns>
                        <asp:BoundField DataField="PlaceID" HeaderText="PlaceID" SortExpression="PlaceID">
                        </asp:BoundField>
                        <asp:BoundField DataField="DeviceID" HeaderText="DeviceID" ReadOnly="True" SortExpression="DeviceID">
                        </asp:BoundField>
                        <asp:BoundField DataField="Date" HeaderText="Date" SortExpression="Date">
                        </asp:BoundField>
                    </Columns>
                </asp:GridView>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
</form>

//.cs
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
     //Find data source and set value for parameter
        ((SqlDataSource)e.Row.FindControl("SqlDataSource2")).SelectParameters["placeid"].DefaultValue = ((System.Data.DataRowView)e.Row.DataItem)["placeid"].ToString();
    }
}

【讨论】:

  • 谢谢你,亚历克斯!我试过了,但这是一个新问题。第一个问题是异常Databinding 表达式仅在具有DataBinding 事件的对象上支持,我找到了答案here 并将 更改为。但是在此之后,当我打开页面时,我收到异常 System.FormatException: Input string was not in a correct format. 你知道我还需要做什么吗?
猜你喜欢
  • 2016-01-22
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多