当数据源中的两列匹配时,如何过滤 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!
因此,将数据视图推入网格中,在您这样做之前,只需设置您需要的过滤器。
我有一个 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!
因此,将数据视图推入网格中,在您这样做之前,只需设置您需要的过滤器。