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

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

我有一个 GridView,其中数据源是根据存储过程填充的数据table 设置的。 datatable 中有两列我感兴趣 filtering/showing 并根据其内容隐藏。 该数据适用于不同课程的课程。

DataTable/Datasource

Identifier Lesson Title BaseIdentifier
CBT-0001 How to Build a Cabinet CBT-0001
CBT-0002 Dangers of Cutting Lumber CBT-0002
TBL-0001 How to Build a Table TBL-0001
TBL-0002 Dangers of Cutting Lumber CBT-0002

在上面 table 课 TBL-0002 只是 CBT-0002 的别名/指针。

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

[ ] 显示别名课程

Identifier Lesson Title BaseIdentifier
CBT-0001 How to Build a Cabinet CBT-0001
CBT-0002 Dangers of Cutting Lumber CBT-0002
TBL-0001 How to Build a Table TBL-0001

[X] 显示别名课程

Identifier Lesson Title BaseIdentifier
CBT-0001 How to Build a Cabinet CBT-0001
CBT-0002 Dangers of Cutting Lumber CBT-0002
TBL-0001 How to Build a Table TBL-0001
TBL-0002 Dangers of Cutting Lumber CBT-0002

我的目标是只查询一次,而不是每次复选框 Checked/unchecked 时都必须重新查询。 唯一一次标识符等于 BaseIdentifier 的时候是 parent 课程(Parents 是他们自己的别名)。

我的代码:

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

我的网格视图:

        <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 上提问的方式!

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

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

[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”(数据 table)之后,我们会根据该 dt 创建一个 dataView。使用数据视图,因为它可以很容易地排序,当然也可以过滤。事实上,您可以 save/shove 将“数据视图”放入会话中并简单地检查 [x] 显示别名课程的状态,然后简单地更改过滤器并重新绑定回网格。 (因此您不需要重新调用填充 table 的存储过程,而只需翻转“数据视图”上的过滤器。这当然假设您将 dv 保存在视图状态或会话中。但实际上,如果您重新调用存储过程,获取数据 table,然后在 table.

上设置“dv”过滤器,则问题为零

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

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