【问题标题】:Filter gridview datasource过滤 gridview 数据源
【发布时间】:2014-11-28 14:24:48
【问题描述】:

我无法使用代码隐藏搜索我的 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 充满了结果......

你有什么建议吗?

编辑

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

【问题讨论】:

  • txtPaperId 在哪里???
  • 忘记粘贴... 1 秒
  • 我发布了答案尝试一下

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


【解决方案1】:

试试这个:

// 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;
        }
    }

【讨论】:

  • 谢谢!下一个问题:是否可以搜索多个strPaperId?
  • 你想一次又一次地搜索??
  • 不,strPaperId IN (id1, id2, id3)
  • 那么您将在文本框中写入的内容可以使用 IN 子句 LIKE strPaperId IN ('id1', 'id2', 'id3')
  • 在我的文本框中:“id1,id2,id3”。但是当使用'strPaperId In {0}'时,这对我不起作用......就像它没有用逗号分隔ID
【解决方案2】:

你应该使用dataview rowfilter.

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

或者也有这种可能性:

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

string += 0

【讨论】:

  • 使用 .AsDataView.RowFilter 时,我得到“值不能为空。\r\n参数名称:表”。但是 txtPaperId.Text 不为空?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多