【问题标题】:Filtering gridview with textbox in header在标题中使用文本框过滤gridview
【发布时间】:2014-11-17 10:31:53
【问题描述】:

我正在尝试在标题中使用textboxes 过滤我的gridview。我为每个textbox 创建了一个textchanged 方法。现在我想过滤gridview 并绑定过滤后的数据。出于某种原因,一旦datasource 遇到textchanged 方法,它就会为空。请参阅下面的代码:

<asp:GridView ID="GridView_Imported" runat="server" CssClass="GridView-Upload" Width="100%" OnRowDataBound="GridView_Imported_RowDataBound" HorizontalAlign="Center" AutoGenerateColumns="False">
            <Columns>
                <asp:TemplateField>
                    <HeaderTemplate>
                        <asp:CheckBox ID="checkAll" runat="server" CssClass="checkAll" onclick="checkAll(this);" />
                    </HeaderTemplate>
                    <ItemTemplate>
                        <asp:CheckBox ID="chkCtrl" runat="server" CssClass="chkCtrl" onclick="Check_Click(this)" />
                    </ItemTemplate>
                    <HeaderStyle HorizontalAlign="Center" />
                </asp:TemplateField>
                <asp:TemplateField AccessibleHeaderText="filter">
                    <HeaderTemplate>
                        <asp:Label ID="lbArticleName" runat="server" Text="Article-Name:" CssClass="Article-Name-Label"></asp:Label>
                        <br/>
                        <asp:TextBox ID="tbFilterArticleName" runat="server" placeholder="Filter..." OnTextChanged="tbFilterArticleName_TextChanged" AutoPostBack="True"></asp:TextBox>
                    </HeaderTemplate>
                    <ItemTemplate>
                        <asp:Label ID="ArticleNameText" runat="server" Text='<%# Eval("Article-Name") %>'></asp:Label>
                    </ItemTemplate>
                    <HeaderStyle HorizontalAlign="Center" />
                </asp:TemplateField>

                <asp:TemplateField>
                    <HeaderTemplate>
                        <asp:Label ID="lbArticle" runat="server" Text="Article:" CssClass="Article-Label"></asp:Label>
                        <br/>
                        <asp:TextBox ID="tbFilterArticle" runat="server" placeholder="Filter..." OnTextChanged="tbFilterArticle_TextChanged" AutoPostBack="True"></asp:TextBox>
                    </HeaderTemplate>
                    <ItemTemplate>
                        <asp:Label ID="lbArticleText" runat="server" Text='<%# Eval("Article") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField>
                    <HeaderTemplate>
                        <asp:Label ID="lbWarehouse" runat="server" Text="Warehouse:" CssClass="Warehouse-Label"></asp:Label>
                        <br/>
                        <asp:TextBox ID="tbFilterWarehouse" runat="server" placeholder="Filter..." OnTextChanged="tbFilterWarehouse_TextChanged" AutoPostBack="True"></asp:TextBox>
                    </HeaderTemplate>
                    <ItemTemplate>
                        <asp:Label ID="lbWarehouseText" runat="server" Text='<%# Eval("Warehouse") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField>
                    <HeaderTemplate>
                        <asp:Label ID="lbLocation" runat="server" Text="Location:" CssClass="Location-Label"></asp:Label>
                        <br/>
                        <asp:TextBox ID="tbFilterLocation" runat="server" placeholder="Filter..." OnTextChanged="tbFilterLocation_TextChanged" AutoPostBack="True"></asp:TextBox>
                    </HeaderTemplate>
                    <ItemTemplate>
                        <asp:Label ID="lbLocationText" runat="server" Text='<%# Eval("Location") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>

            </Columns>

            <HeaderStyle HorizontalAlign="Center" />
            <RowStyle HorizontalAlign="Center" />

        </asp:GridView>

        protected void tbFilterArticleName_TextChanged(object sender, EventArgs e)
        {
            var tb = (TextBox) sender as TextBox;

            GridView_Imported.DataSource = (Session["dataSource"] as DataTable).DefaultView.RowFilter = string.Format("Article-Name LIKE '%{0}%'", tb.Text.Trim());


            GridView_Imported.DataBind();
        }

我错过了什么?

【问题讨论】:

    标签: c# asp.net gridview datagridviewtextboxcell


    【解决方案1】:

    您的代码中有两个错误。

    首先将列名Article-Name 放在括号中作为[Article-Name]。

    第二种将数据源分配给gridview的方式。请看下面的正确方法。

            var dt = (Session["dataSource"] as DataTable);
            dt.DefaultView.RowFilter = string.Format("[Article-Name] LIKE '%{0}%'", tb.Text.Trim());
            GridView_Imported.DataSource = dt;
            GridView_Imported.DataBind();
    

    【讨论】:

    • 由于某种原因,到达此代码的行数为 0。获取当前显示在 gridview 上的数据可能更好?
    【解决方案2】:

    使用http://www.datatables.net/

    提供数据过滤、排序、分页等功能。

    只需在您的 gridview 上方放置一个带有一些 id 的 html 表格标题

    <HeaderTemplate>
      <table id="tblData" border="0" cellpadding="5" cellspacing="1" width="100%">
        <thead>
           <th align="center" width="3%">S.No.&nbsp;
           </th>
           <th align="center" width="10%">RFQ ID &nbsp;
           </th>
        </thead>
    </HeaderTemplate>
    

    添加添加jquery脚本

    $(document).ready(function () {
        $('#tblData').DataTable();
    });
    

    【讨论】:

      【解决方案3】:

      首先,在 gridview 的 RowDataBound 事件中(找到你的文本框):

          System.Web.UI.WebControls.TextBox tbFilterArticle;
          protected void GridView_Imported_RowDataBound(object sender, GridViewRowEventArgs e)
          {
              if (GridView_Imported.HeaderRow != null)
              {
                  tbFilterArticle = (System.Web.UI.WebControls.TextBox)GridView_Imported.HeaderRow.FindControl("tbSearchUser");
              }
          }
      

      之后,使用它的值(在任何你想要的地方,我将它用于按钮点击事件):

      string article = tbFilterArticle.Text;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-08
        • 2018-03-14
        • 2013-07-29
        • 2012-04-27
        • 2012-06-09
        • 1970-01-01
        • 2011-03-23
        相关资源
        最近更新 更多