基于GridView之外的Checkbox过滤GridView数据?

时间:2012-04-20 12:28:57

标签: c# asp.net gridview

我的页面上有5个复选框和带有模板字段的网格视图,我没有在页面加载时使用任何绑定字段我将网格与表格的所有数据绑定,我想基于此过滤数据复选框检查。

假设:我有像A B C D这样的复选框。所有复选框都在网格视图的外边。当用户选中复选框A,然后在网格视图中,复选框应显示相关数据,就像B C和D一样明智。

怎么做?,请给出一些示例代码和位逻辑。

如果我能够在没有任何回发的情况下过滤gridview,那就太棒了。

网格:

 <asp:GridView ID="GridView1" runat="server" 
                AutoGenerateColumns="False" CellPadding="3">
      <Columns>
          <asp:TemplateField HeaderText="ID" SortExpression="ID">
            <ItemTemplate>
              <asp:Label ID="lblId" runat="server" Text='<%#Eval("Id") %>'></asp:Label>
           </ItemTemplate>                           
         </asp:TemplateField>
         <asp:TemplateField HeaderText="Discription" SortExpression="Discription">
            <ItemTemplate>
              <asp:Label ID="lblDiscription" runat="server" Text='<%#Eval("Discription") %>'></asp:Label>
            </ItemTemplate>                        
         </asp:TemplateField>
         <asp:TemplateField HeaderText="Address" SortExpression="Address">
            <ItemTemplate>
             <asp:Label ID="lblAddress" runat="server" Text='<%#Eval("Address") %>'></asp:Label>
            </ItemTemplate>
         </asp:TemplateField>
     </Columns>
 </asp:GridView>

绑定网格:

TestPageDao page1Dao = new TestPageDao ();

if (!IsPostBack)
{
  IList<TestDAO> TestDAO = page1Dao.GetAlldata();
  GridView1.DataSource = TestDAO;
  GridView1.DataBind();
}

我尝试了Filter gridviewhttp://forums.asp.net/p/1034014/2904713.aspx

1 个答案:

答案 0 :(得分:2)

如果你想避免回发,可以像这里一样使用jQuery: http://jquerybyexample.blogspot.com/2012/04/how-to-filter-gridview-records-using.html

另一种选择是AJAX,但在故事的最后,它是一种类似回发的方法。

最后使用回发,您可以通过在GridView加载之前动态设置GridView过滤器 ,以多种方式完成此操作。这可以通过Page load事件,关联数据源的OnSelecting(如果有)或类似事件来实现。

这是aspx的提取:

<asp:CheckBox ID="CheckBox1" runat="server" Text="A" />
<asp:CheckBox ID="CheckBox2" runat="server" Text="B" />
<asp:CheckBox ID="CheckBox3" runat="server" Text="C" />
<asp:CheckBox ID="CheckBox4" runat="server" Text="D" />
<hr />

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
    DataSourceID="sqlDataSourceGridView" AutoGenerateColumns="False"
    CssClass="GridViewStyle" GridLines="None" Width="650px" >
    <Columns> 
        <asp:BoundField DataField="CompanyName" HeaderText="Company" ItemStyle-Width="200px" />
        <asp:BoundField DataField="ContactName" HeaderText="Name" ItemStyle-Width="125px"/>
        <asp:BoundField DataField="City" HeaderText="city" ItemStyle-Width="125px" />
        <asp:BoundField DataField="Country" HeaderText="Country" ItemStyle-Width="125px" />
    </Columns>
</asp:GridView>

<asp:SqlDataSource ID="SqlDataSourceGridView" runat="server" 
    ConnectionString="<%$ ConnectionStrings:northWindConnectionString %>" 
    SelectCommand="SELECT [CustomerID], [CompanyName], [ContactName], [City], [Country] FROM [Customers]" 
    OnSelecting="SqlDataSourceGridView_Selecting">
 <FilterParameters>
    <asp:ControlParameter ControlID="checkbox1" Name="CompanyName" PropertyName="Checked" ConvertEmptyStringToNull="false" />
 </FilterParameters>
</asp:SqlDataSource>

请注意OnSelecting事件,并注意没有任何过滤器预设。

现在在代码后面动态设置过滤器:

protected void SqlDataSourceGridView_Selecting(object sender, SqlDataSourceSelectingEventArgs e) {
    SqlDataSourceGridView.FilterExpression = string.Empty;
    if (CheckBox1.Checked) {
        SqlDataSourceGridView.FilterExpression += "(CompanyName=1)";
    }
    if (CheckBox2.Checked) {
        if (!string.IsNullOrEmpty(SqlDataSourceGridView.FilterExpression)) SqlDataSourceGridView.FilterExpression += " OR ";
        SqlDataSourceGridView.FilterExpression += "(B=1)";
    }
    if (CheckBox3.Checked) {
        if (!string.IsNullOrEmpty(SqlDataSourceGridView.FilterExpression)) SqlDataSourceGridView.FilterExpression += " OR ";
        SqlDataSourceGridView.FilterExpression += "(C=1)";
    }
    if (CheckBox4.Checked) {
        if (!string.IsNullOrEmpty(SqlDataSourceGridView.FilterExpression)) SqlDataSourceGridView.FilterExpression += " OR ";
        SqlDataSourceGridView.FilterExpression += "(D=1)";
    }
}

如果您不喜欢OnSelecting事件,可以在PageLoad中执行相同操作:

protected void Page_Load(object sender, EventArgs e) {
    // here same code of above
    // . . .
}

我没有测试它,因此验证了小错误。