在ASP.NET GridView控件中维护行选择

在ASP.NET GridView控件中维护行选择,asp.net,ajax,gridview,postback,Asp.net,Ajax,Gridview,Postback,设置: 我现在有一个页面,上面有一个GridView控件,位于一个更新面板内,使用的是SqlDataSource。我有一个计时器设置,每X秒更新一次GridView。通常情况下,每当GridView更新时,会向GridView添加大约4-5行新数据,而最后4-5行数据会被丢弃。我一次只显示15个结果,每次更新都会有新的结果 问题是: 我允许用户在更新GridView时选择行。我通过设置SelectedIndex属性来处理这个问题。但是,当我选择一行,然后网格被更新时,用户选择的行被向下推大约4-

设置: 我现在有一个页面,上面有一个GridView控件,位于一个更新面板内,使用的是SqlDataSource。我有一个计时器设置,每X秒更新一次GridView。通常情况下,每当GridView更新时,会向GridView添加大约4-5行新数据,而最后4-5行数据会被丢弃。我一次只显示15个结果,每次更新都会有新的结果

问题是: 我允许用户在更新GridView时选择行。我通过设置SelectedIndex属性来处理这个问题。但是,当我选择一行,然后网格被更新时,用户选择的行被向下推大约4-5行,而先前选择的索引中的数据被选择。因此,他们单击的位置在此时被选中,而不是他们单击的位置

如果可能的话,我需要一种方法来确定在SqlDataSource/Gridview中添加了多少新行。或者通过行中的数据而不仅仅是SelectedIndex来维护所选数据的方法

谢谢你的帮助

决议:
好的,我继续向我的网格添加了一个新的不可见列,现在我正在跟踪从DB中选择的唯一ID。通过在数据绑定之前设置一个数组,并将其与数据绑定之后得到的新数组进行比较,我能够使用一个简单的交集来确定相同的行数。然后我用它来确定这次发回的新邮件总数。

只是一个想法:

我认为您可以使用一个不可见列(更具体地说是一个
ID
列)将所选行的
ID
值存储在
会话
对象中,然后在网格更新后,您可以检索该值并再次选择仍存在的行。

只是一个想法:


我认为您可以使用不可见列(更具体地说是
ID
列)将所选行的
ID
值存储在
Session
对象中,然后在网格更新后,您可以检索该值并选择行如果它们仍然存在,请重试。

如果您有自定义GridView
OnRowUpdate
事件

public void GridView_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    Session["CurrIndex"] = GridView.SelectedIndex;//index before insertion
    Session["RowCount"] = GridView.Rows.Count;//row count before insertion
    //Add new Rows
    GridView.SelectedIndex = (Int32)(Session["CurrIndex"]) + ( GridView.Rows.Count - (Int32)(Session["RowCount"]);//update selected index
    Session["CurrIndex"] = GridView.SelectedIndex;//restore the index into session
}  

如果您有自定义GridView
OnRowUpdate
事件

public void GridView_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    Session["CurrIndex"] = GridView.SelectedIndex;//index before insertion
    Session["RowCount"] = GridView.Rows.Count;//row count before insertion
    //Add new Rows
    GridView.SelectedIndex = (Int32)(Session["CurrIndex"]) + ( GridView.Rows.Count - (Int32)(Session["RowCount"]);//update selected index
    Session["CurrIndex"] = GridView.SelectedIndex;//restore the index into session
}  

嗯,我明白了。是的,这会起作用,但在我的场景中,这可能需要大量的处理。另外,我想知道是否有一种方法可以确定数据绑定的行中有多少是新的,这可能会非常有帮助,因为这样我就不必再次在所有行中搜索可能存在或不存在的ID。您希望网格中有多少行?我认为这不需要太多的处理。。。它们只是数字,搜索速度会非常快。好吧,我继续向我的网格中添加了一个新的不可见列,现在我正在跟踪从数据库中选择的唯一ID。通过在数据绑定之前设置一个数组,并将其与数据绑定之后得到的新数组进行比较,我能够使用一个简单的交集来确定相同的行数。然后我用它来确定这次发回的新邮件总数,就是这样。解决这个问题的好办法。大约两年前,我做过类似的事情,只是为了记录在案。:)嗯,我明白了。是的,这会起作用,但在我的场景中,这可能需要大量的处理。另外,我想知道是否有一种方法可以确定数据绑定的行中有多少是新的,这可能会非常有帮助,因为这样我就不必再次在所有行中搜索可能存在或不存在的ID。您希望网格中有多少行?我认为这不需要太多的处理。。。它们只是数字,搜索速度会非常快。好吧,我继续向我的网格中添加了一个新的不可见列,现在我正在跟踪从数据库中选择的唯一ID。通过在数据绑定之前设置一个数组,并将其与数据绑定之后得到的新数组进行比较,我能够使用一个简单的交集来确定相同的行数。然后我用它来确定这次发回的新邮件总数,就是这样。解决这个问题的好办法。大约两年前,我做过类似的事情,只是为了记录在案。:)谢谢你的建议。我现在正在做类似的事情,但请注意,此事件发生在用户更新行时,而不是在数据绑定/添加行时。感谢您的建议。我现在正在做类似的事情,但请注意,此事件发生在用户更新行时,而不是在数据绑定/添加行时。