Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Gridview搜索或查询的结果?_C#_Asp.net_Gridview - Fatal编程技术网

C# Gridview搜索或查询的结果?

C# Gridview搜索或查询的结果?,c#,asp.net,gridview,C#,Asp.net,Gridview,我们有一个可以编辑的gridview,这个gridview由RegularSearch()或SearchById(字符串Id)填充 代码如下: protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { string empId = Request.QueryString["EmpId"];

我们有一个可以编辑的gridview,这个gridview由
RegularSearch()
SearchById(字符串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\u EmpId\u RowEditing
将通过
SearchByEmpId(EmpId)重新绑定GridView
我将用
empid
编辑这一行。那很好

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

问题是当我编辑一行时,
GridView\u EmpId\u RowEditing
将被调用,它将重新检查查询字符串。由于
Request.QueryString[“EmpId”]
将具有来自上一个请求的值,
GridView\u EmpId\u RowEditing
将使用
SearchByEmpId(EmpId)绑定GridView而不是
常规搜索()


解决此问题的方法有很多(例如会话变量或viewstate),但必须有一种更优雅的方法来解决此问题。

您可以使用属性保留现有内容并将其绑定到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;
}

通常,在edit方法中,我将从所选行的数据而不是查询参数中获取记录Id。也就是说,您可以使用属性保留现有内容并将其绑定到ViewState。为什么关闭这个问题?为什么关闭这个问题?好吧,推测一下亲密选民的想法,我突然想到:必须有一个更优雅的方式来解决这个问题——“优雅”是一个意见问题,而不是事实。看看为什么不鼓励这样做。在你的问题中,你甚至说有很多种方法可以解决这个问题,所以你可以根据自己的标准选择一种。我只会在第一页的帖子上使用过滤器。对于任何其他情况,请使用viewstate,其中可能包括行编辑事件。所以,在页面加载时,将查询值移动到viewstate,所有过滤代码现在都可以针对viewstate(“MyFilter”)工作。这意味着如果你点击清除,或者再次搜索,或者别的什么?您可以清除或重新设置ViewState(“MyFilter”)=“”或其他内容。因此,在第一次发布到页面(postback=false)上,然后按您所做的那样,将查询筛选值移动到viewstate-所有附加代码都可以使用viewstate-您可以根据需要清除/设置/重置。