2010-11-05 57 views
1

我在webform上有一个ASP.net gridview,用户可以选择一行。当他们选择它时,该行将突出显示为黄色。问题是,当我排序表时,它排序正确,但突出显示保持在同一行。数据全部移动,但突出显示仍然存在。GridView排序时突出显示的行不会移动

任何人都可以提出如何使突出显示保持与数据?

+0

检查此链接:阅读马克Rideout的后,看看是否适合你:http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/01f937af-d0d0-4de5-8919-088e88c5af77/ – mint 2010-11-05 19:02:38

+0

我不认为这正是我需要的。但它确实提供了一个基本框架:在排序之前获取表datakeyvalue,然后让排序发生,将selectedrowindex重新分配给该键,然后重新高亮。问题是如何在没有循环的情况下分配正确的索引。 – MAW74656 2010-11-05 19:08:19

+0

有没有一种方法可以找到特定datakey值的索引? – MAW74656 2010-11-05 19:33:52

回答

1

在排序之前抓取SelectedDataKey.Value(OnSorting?)。 然后排序(?OnSorted)后,使用类似:

foreach(var row in GridView1.Rows) 
{ 
    var i = Convert.ToInt32(ViewState["MySavedSelectedDataKey"])); 
    if(GridView1.DataKeys[row.RowIndex].Value == i) 
    { 
     GridView1.SelectedIndex = row.RowIndex; 
     break; 
    } 
} 

您可能需要再次调用DataBind(),以显示新集的SelectedIndex。

我不相信无论如何不循环每行都可以做到这一点。但是如果你有分页,那么你只需循环你的PageSize属性中的行数,而不是从数据库返回的每一行。

0

问题是,您正在排序网格的数据源,而不是网格。

在排序前获取所选行的ID,然后在排序后将其设置为选中状态。

+0

问题是,排序后数据现在处于不同的索引中。我需要找到并设置新的索引。 – MAW74656 2010-11-05 19:09:12

0

很简单找到当前选择的项目datakey - MyGrid.SelectedDataKey.Value.ToString() 如果你有一个单一的DataKey那是,不然你要读两个值,这是在MyGrid.SelectedDataKey.Values

可用

排序后,您必须迭代项目并找到具有匹配数据项的项目。 MyGrid.Rows [i] .DataItem应该对此有所帮助 - 请注意,这仅在数据绑定时可用,所以如果您重新排序而没有重新数据绑定(例如,如果将所有数据存储在视图状态中),它将不包含任何内容。

+0

我得到了第一部分没有问题。但是,如何使用.DataItem来查看单元格值? – MAW74656 2010-11-05 21:03:54

+0

请注意,单元格值和数据源项目值之间存在差异。你可以访问单元格的值没有问题 - 只是行[]。Cells []。Controls []集合。但这些将被格式化。更好地访问DataItem - 它实际上包含DataRow或类似的类型(在调试器中确定),您可以读取该行数据绑定到的实际值。 – Artemiy 2010-11-05 22:25:33