【问题标题】:Gridview filtering wont work when it has returned empty当它返回空时,Gridview过滤将不起作用
【发布时间】:2013-07-22 14:53:32
【问题描述】:

我已经设法为过滤一个几乎可以正常工作的 gridView 找了一个糟糕的借口,除非我输入了一个不返回任何内容的值。

例如,假设我有值 11、12、23 和 24。如果我在文本框中输入 '1',我只会看到 '11' 和 '12'(即使结果打开也有效不同的页面)。当我删除“1”时,我将再次看到所有值。太棒了!

但是如果我输入“3”,它会返回一个空表(到目前为止还不错),当我删除 3 时......仍然是空的!有谁知道这是为什么?

这是我的(重要的)代码:

平均售价

    <asp:HiddenField ID="hfText" runat="server" ClientIDMode="Static" />
    <input type="text" id="input" style="width: 66px;"/>
    <asp:GridView ID="myGv" runat="server" 
        ShowFooter="True" 
        AutoGenerateColumns="False" AllowPaging="true" AllowSorting="True"
        DataKeyNames="DataKeyId" DataSourceID="ObjectDataSource1" >
        <Columns>
            <asp:BoundField DataField="DataKeyId" HeaderText="DataKey" Visible="false" InsertVisible="False" ReadOnly="True" SortExpression="DataKeyId" />
            <asp:BoundField DataField="header1" HeaderText="Header1" SortExpression="header1" ReadOnly="True" />
            <asp:BoundField DataField="header2" HeaderText="Header2" SortExpression="header2" ReadOnly="True" />
        </Columns>
        <EmptyDataTemplate>
             No data found!
        </EmptyDataTemplate>
    </asp:GridView>
    <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="mySelectMethod" TypeName="WhereItsAt" >
        <SelectParameters>
            <asp:Parameter Name="header1" Type="String" Defaultvalue="" />
        </SelectParameters>
    </asp:ObjectDataSource>

jQuery

 $(document).ready(function () {

     /* This piece of code just makes sure that the text remains after postback */
     $('#input').val($('#hfText').val());
     $('#input').focus();
     var textval = $('#input').val();
     $('#input').val("");
     $('#input').val(textval);
     /*******************/

     $('#input').keyup(function (event) {
         $('#hfText').val($('#input').val()).trigger('change');      
              __doPostBack('thisUrl.aspx', $('#input').val());
         });
     });
 });

C#(代码隐藏)

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        myGv.DataBind();
    }
    else
    {
        if (!Request["__EVENTARGUMENT"].Contains("Page$"))
        {
             reBind(Request["__EVENTARGUMENT"]);
        }
    }
}

protected void reBind(String sParam)
{
    ObjectDataSource1.SelectParameters.Remove(ObjectDataSource1.SelectParameters["header1"]);
    ObjectDataSource1.SelectParameters.Add("header1", sParam);
    myGv.DataBind();
}

(希望这不是 TL;DR)

编辑 在输入一个不返回任何内容的值然后输入一个应该返回某些内容的值后,我收到 javascript 错误“ReferenceError: __doPostBack is not defined”!

【问题讨论】:

  • 您是否尝试使用文本框搜索网格视图?
  • 我正在使用文本框中的值重新绑定网格视图中的数据。所以是的,差不多
  • 为什么不使用 asp.net 服务器控件添加文本框并使用文本框文本更改事件完成 redbind。你有什么问题吗?
  • 你为什么不使用jQuery AJAX请求而不是__doPostBack(),如果你使用jQuery,我觉得__doPostBack()不是一个正确的方法。
  • 正如我想说的那样,这对我来说似乎不是正确的方法。我可能无法帮助您解决这个问题。但是,我可以向您推荐这个:technology2grab.blogspot.ca/2012/10/… 用于特定问题的解决方案,encosia.com/… 用于 jQuery AJAX,我个人使用数据表插件来实现类似这样的功能:datatables.net/release-datatables/examples/basic_init/…(很容易实现,您不必担心关于质量和性能)

标签: c# jquery asp.net gridview filtering


【解决方案1】:

找到了一个超级简单的解决方案!

我所要做的就是在我的页面加载中添加ClientScript.GetPostBackEventReference(this, string.Empty);,如下所示:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        myGv.DataBind();
    }
    else
    {
        ClientScript.GetPostBackEventReference(this, string.Empty);
        if (!Request["__EVENTARGUMENT"].Contains("Page$"))
        {
             reBind(Request["__EVENTARGUMENT"]);
        }
    }
}

【讨论】:

    猜你喜欢
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多