【问题标题】:Gridview results from search or querystring?来自搜索或查询字符串的 Gridview 结果?
【发布时间】:2021-08-16 05:03:43
【问题描述】:

我们有一个可以编辑的网格视图,这个网格视图由RegularSearch()SearchById(string Id) 填充。

这是代码:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {

            string empId = Request.QueryString["EmpId"];

            if (!string.IsNullOrEmpty(empId))
            {
                SearchByEmpId(empId);
            }
            else
            {
                RegularSearch();
            }
        }
    }
    
    protected void GridView_EmpId_RowEditing(object sender, GridViewEditEventArgs e)
    {
        GridView_EmpId.EditIndex = e.NewEditIndex;
        string empId = Request.QueryString["empId"];
        if (!string.IsNullOrEmpty(empId))
        {
            SearchByEmpId(empId);
        }
        else
        {
            RegularSearch();
        }
        // Start editing gridview row
    }
    
    

当我访问页面 Employees.aspx?empId=ABC123 时,SearchByEmpId(empId) 被调用并且网格将显示一行。当我单击“编辑”时,GridView_EmpId_RowEditing 将通过SearchByEmpId(empId); 重新绑定网格视图,我将使用empid 编辑一行。没关系。

我编辑该行,然后单击“搜索”按钮,该按钮将调用 RegularSearch();。结果,比如 200 行,将显示在网格中。

问题是当我编辑一行时,GridView_EmpId_RowEditing 将被调用,它会重新检查查询字符串。由于Request.QueryString["EmpId"] 将具有上一个请求的值,因此GridView_EmpId_RowEditing 将使用SearchByEmpId(empId); 而不是RegularSearch(); 绑定gridview。

有很多方法可以解决这个问题(例如会话变量或视图状态),但必须有更优雅的方法来解决这个问题。

【问题讨论】:

  • 通常,在编辑方法中,我会从所选行的数据而不是查询参数中获取记录 ID。也就是说,您可能可以使用属性保留您所拥有的并将其绑定到 ViewState。
  • 我建议您在进行搜索或点击搜索按钮时,清除 url 参数。例如:codeproject.com/Tips/177679/…
  • 为什么要结束这个问题?
  • 为什么要结束这个问题?好吧,推测密切选民的想法,我突然想到:必须有一个更优雅的方法来解决这 - “优雅”是见仁见智的问题,而不是事实。请参阅this Meta question,了解为什么不鼓励这些。在您的问题中,您甚至说 有很多方法可以解决问题 - 所以您可以根据自己的标准选择一种。
  • 我只会在第一页回发时使用过滤器。对于任何其他,使用 viewstate - 并且可能/将包括行编辑事件。因此,在页面加载时,将查询值移动到视图状态中,所有过滤器代码现在都适用于 ViewState("MyFilter")。这意味着如果你清除,或者再次搜索,或者其他什么?您可以清除或重新设置 ViewState("MyFilter") = "" 或其他任何东西。因此,在第一次发布到页面时(postback = false),然后像您一样,但是将查询过滤器值移动到视图状态 - 因此所有附加代码都可以使用视图状态 - 您可以随意清除/设置/重置。

标签: c# asp.net gridview


【解决方案1】:

您可以使用属性保留已有的内容并将其绑定到 ViewState,确保在编辑完成后清除该属性。

但通常,我会从所选行的数据中获取记录 ID,而不是 ViewState 映射属性。

这是一个使用 ViewState 的示例...

// new property using the ViewState to retain the data across requests.
private string SelectedEmpId
{
    get
    {
        if(ViewState["SelectedEmpId"] == null)
        {
            ViewState["SelectedEmpId"] = string.Empty;
        }
        return ViewState["SelectedEmpId"].ToString();
    }
    set
    {
        ViewState["SelectedEmpId"] = value;
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)    
    {    
        // set property from your query param
        SelectedEmpId = Request.QueryString["EmpId"];
    
        if (!string.IsNullOrEmpty(SelectedEmpId))
        {
            SearchByEmpId(SelectedEmpId);
        }
        else
        {
            RegularSearch();
        }
    }
}

protected void GridView_EmpId_RowEditing(object sender, GridViewEditEventArgs e)
{
    GridView_EmpId.EditIndex = e.NewEditIndex;
    // we reference our ViewState mapped property
    if (!string.IsNullOrEmpty(SelectedEmpId))
    {
        SearchByEmpId(SelectedEmpId);
    }
    else
    {
        RegularSearch();
    }
    // Start editing gridview row
    // ...

    // clear ViewState mapped property after edit is completed
    SelectedEmpId = string.Empty;
}

【讨论】:

    猜你喜欢
    • 2013-05-09
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 2020-10-14
    • 1970-01-01
    • 2019-03-16
    相关资源
    最近更新 更多