2014-10-03 89 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