繁体   English   中英

当数据源中的两列匹配时,如何过滤 gridview

[英]How can I filter a gridview when two columns in the datasource match

我有一个 GridView ,其中数据源是从存储过程填充的数据表中设置的。 数据表中有两列我有兴趣根据它们的内容过滤/显示和隐藏。 数据用于不同课程的课程。

数据表/数据源

标识符 课程名称 基标识符
CBT-0001 如何建造橱柜 CBT-0001
CBT-0002 切割木材的危险 CBT-0002
TBL-0001 如何建立一个表 TBL-0001
TBL-0002 切割木材的危险 CBT-0002

在上表中,Lesson TBL-0002 只是 CBT-0002 的别名/指针。

基于一个复选框,我需要显示 Gridview 中的所有内容,并且我只需要显示标识符 = baseIdentifier 的父课程。 因此,在过滤/或隐藏行之后,我的 gridview 将如下所示:

[ ] 显示别名课程

标识符 课程名称 基标识符
CBT-0001 如何建造橱柜 CBT-0001
CBT-0002 切割木材的危险 CBT-0002
TBL-0001 如何建立一个表 TBL-0001

[X] 显示别名课程

标识符 课程名称 基标识符
CBT-0001 如何建造橱柜 CBT-0001
CBT-0002 切割木材的危险 CBT-0002
TBL-0001 如何建立一个表 TBL-0001
TBL-0002 切割木材的危险 CBT-0002

我的目标是只查询一次,而不是每次选中/取消选中复选框时都必须重新查询。 唯一一次 Identifier 等于 BaseIdentifier 是当它是父课程时(父母是他们自己的别名)。

我的代码:

            PathBO pathBO = new PathBO();
            LessonBO lessonBO = new LessonBO();
            pathBO.GetPath();
            DataTable dt = new DataTable();
            dt = lessonBO.GetAllAliasLessons();
            gvLessons.DataSource = dt;
            gvLessons.DataBind();

我的 Gridview:

        <asp:GridView ID="gvLessons" runat="server" cssClass="Grid" GridLines="None" AutoGenerateColumns="False" AllowSorting="true">
            <AlternatingRowStyle cssClass="GridAltRow" />
            <Columns>
                <asp:BoundField DataField="Identifier" HeaderText="Identifier" SortExpression="Identifier" />
                <asp:BoundField DataField="SectionTitle" HeaderText="SectionTitle" />
                <asp:BoundField DataField="VersionNum" HeaderText="VersionNumber" />
                <asp:BoundField DataField="AliasList" HeaderText="AliasList" />
                <asp:BoundField DataField="BaseIdentifier" HeaderText="BaseIdentifier" Visible="False" />
            </Columns>
            <EditRowStyle cssClass="GridEditRow" />
            <FooterStyle cssClass="GridFooter" />
            <HeaderStyle cssClass="GridHeader" />
            <PagerStyle cssClass="GridPager" />
            <RowStyle cssClass="GridRow" />
            <SelectedRowStyle cssClass="GridSelectedRow" />
            <SortedAscendingCellStyle cssClass="GridSortAscCell" />
            <SortedAscendingHeaderStyle cssClass="GridSortAscHeader" />
            <SortedDescendingCellStyle cssClass="GridSortDescCell" />
            <SortedDescendingHeaderStyle cssClass="GridSortDescHeader" />
        </asp:GridView>

谢谢

第一? 伙计们-这就是您在SO上提问的方式!

不要发布 200 行代码,但要发布我们需要的确切代码行!

好的,读到这里? 好吧,我们的过滤器实际上变成了:

[x] 显示别名课程

If "Identifer" <> "BaseIdentifer" then
    Show all lessons
Else
   "Identifier" = "BaseIdentifer"

所以,你的代码变成了这样:

    DataView dtMyFilterView As new DataView
    dtMyFilterView = dt

    If ShowAliasLessons.Checked = True Then
        dtMyFilterView.RowFilter = ""
    Else
        dtMyFilterView.RowFilter = "Identifier <> BaseIdentifier"
    End If

    gvLessons.DataSource = dtMyFilterView
    gvLessons.DataBind();

编辑:取决于过滤器 - 如果您只想要非别名,则不清楚。

但你当然可以这样做:

    If ShowAliasLessons.Checked = True Then
        dtMyFilterView.RowFilter = ""Identifier <> BaseIdentifier""
    Else
        dtMyFilterView.RowFilter = "Identifier = BaseIdentifier"
    End If

因此,无论如何,取决于所有课程,或者只有非别名与别名。 (但是,你明白了,选择是你的)。

现在我在 vb 和 c# 之间修改了代码。 但是在您设置“dt”(数据表)之后,我们会根据该 dt 创建一个 dataView。 使用数据视图,因为它可以轻松排序,当然也可以过滤。 事实上,您可以将“数据视图”保存/推入 session 并简单地检查 [x] 显示别名课程的状态,然后简单地更改过滤器并重新绑定回网格。 (因此,您不需要重新调用填充表的存储过程,而只需在“数据视图”上翻转过滤器。这当然假设您将 dv 保存在视图状态或 session 中。但实际上,如果如果您重新调用存储过程,请获取数据表,然后在该表上设置“dv”过滤器。

所以只需添加一个“新”中间步骤。 在数据表和 gridview 之间使用“数据视图”。 数据视图是为这个问题量身定做的。 您可以过滤、排序或执行任何操作,然后用数据绑定该“数据视图”来代替表格!

因此,将数据视图推入网格中,在您这样做之前,只需设置您需要的过滤器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM