1

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

假设:我有像 ABC D 这样的复选框。所有复选框都在网格视图之外。当用户选中复选框 A 时,然后在网格视图中,应显示复选框 A 相关数据,就像 BC 和 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

4

1 回答 1

2

如果您想避免回发,请使用 jQuery,如下所示:http: //jquerybyexample.blogspot.com/2012/04/how-to-filter-gridview-records-using.html

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

最后使用回发,您可以通过在加载GridView之前动态设置 GridView 过滤器来以多种方式完成此操作。这可以通过页面加载事件、关联数据源的 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
    // . . .
}

我没有测试它,所以验证小错误。

于 2012-04-20T13:44:52.370 回答