2014-10-03 66 views
2

我不能通过使用代码隐藏搜索我的gridview结果。过滤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; 
    } 
} 

当我按下“搜索”按钮,我得到“未将对象引用设置到对象的实例“。

按下搜索按钮之前(这是另一个按钮......)ObjectDataSource控件设置,所以当FilterResult会在GridView充满结果..

你有任何的提示,我怎么能做到这一点?

编辑

解决它。这是因为我的数据源为空,所以我必须重新绑定它。

+0

哪里是txtPaperId ??? – 2014-10-03 14:04:12

+0

忘了粘贴在... 1秒 – MrProgram 2014-10-03 14:05:05

+0

我发布了答案尝试 – 2014-10-03 14:18:09

回答

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; 
     } 
    } 
+0

谢谢!下一个问题:是否可以搜索几个strPaperId? – MrProgram 2014-10-03 14:20:45

+0

你想再次搜索? – 2014-10-03 14:25:33

+0

不,strPaperId IN(id1,id2,id3) – MrProgram 2014-10-03 14:27:01

1

您应该使用dataview rowfilter.

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

或者也存在这种可能性:

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

string += 0 
+0

当使用.AsDataView.RowFilter我得到“值不能为空。\ r \ nParameter name:table”。但txtPaperId.Text不为空? – MrProgram 2014-10-03 14:09:36

+0

更新了我的答案 – 2014-10-03 14:35:56