过滤gridview数据源

时间:2014-10-03 14:03:03

标签: c# asp.net gridview filter code-behind

我无法使用代码隐藏搜索我的gridview结果。

我有一个按钮和一个gridview:

<asp:TextBox ID="txtPaperId" Width="146" runat="server"  />
<asp:Button runat="server" ID="btnSearch" Text="Search" OnClick="FilterResult"/>

<asp:GridView ID="gvwResavePositions" runat="server" EmptyDataText="No Positions found!"
    AllowPaging="True" AllowSorting="True" PageSize="50" AutoGenerateColumns="False"
    SkinID="gridviewGridlinesSkin" HeaderStyle-HorizontalAlign="Left" 
    OnPageIndexChanging="gvwResavePositions_PageIndexChanged"
    HorizontalAlign="Left" Width="100%">
        <HeaderStyle BackColor="DarkGray" Font-Bold="True" HorizontalAlign="left"  />
        <RowStyle HorizontalAlign="Left" />
        <Columns>
            <asp:BoundField  ItemStyle-Width="40px" DataField="strPaperId" HeaderText="K+Id / PaperId" ReadOnly="True"/>
            <asp:TemplateField HeaderText="Resave">
                <ItemTemplate>
                    <asp:CheckBox ID="bResave" runat="server" Width="50"/>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
        <HeaderStyle HorizontalAlign="Left" />
    </asp:GridView>

我的代码背后:

protected void FilterResult(object sender, EventArgs e)
{
    try
    {
        (gvwResavePositions.DataSource as DataTable).DefaultView.RowFilter = string.Format("strPaperId = '{0}'",
            txtPaperId.Text);
    }
    catch (Exception ex)
    {
        var t = ex.Message;
    }
}

当我按下&#34;搜索&#34;按钮我得到&#34;对象引用未设置为对象的实例。&#34;

在按下搜索按钮之前设置了objectdatasource(它是另一个按钮......),所以当FilterResult进行时,gridview充满了结果..

你有什么提示我能做到这一点吗?

修改

解决了它。这是因为我的数据源是null,所以我不得不重新绑定它。

2 个答案:

答案 0 :(得分:3)

试试这个:

// save your datatable in session while binding gridview
    // Session["Dt_GridView"]=Your_datatable; 
    protected void FilterResult(object sender, EventArgs e)
    {
        try
        {
           // DataTable dt = (DataTable)gvwResavePositions.DataSource; this reutrn null
            // hence
            //gvwResavePositions.DataSource as DataTable this will return null



            DataTable dt = (DataTable)Session["Dt_GridView"];

         dt.DefaultView.RowFilter = string.Format("strPaperId = '{0}'",
                txtPaperId.Text);
         gvwResavePositions.DataSource = dt;
          gvwResavePositions.DataBind();
            }
        catch (Exception ex)
        {
            var t = ex.Message;
        }
    }

答案 1 :(得分:1)

您应该使用dataview rowfilter.

更新:您必须使用correct parameters。 使用rowfilter,还可以过滤已经过滤的项目(这是您的下一个问题)。

或者也有这种可能性:

string strWhere = string.empty
foreach (string id in ids)
{
string += id + " OR " 
}

string += 0