我有一个可排序的asp.net ListView。
我有一个带有“select”命令名称的按钮。当我单击按钮时,将选择相应的行。如果我然后单击排序标题,ListView将排序,但所选索引将保持不变。换句话说,如果我单击第二行,则排序第二行仍然被选中。
有没有办法让ListView在排序后选择合适的行,这样如果我点击一个项目然后排序相同的项目仍然会被选中但根据排序处于不同的位置?
答案 0 :(得分:1)
你必须以编程方式进行 - 尽管解决方案有点令人讨厌。 第一步是在ListView中定义DataKeys和onSorting和Sorted事件,如下所示
<asp:ListView ID="ListView1" runat="server" DataSourceID="SqlDataSource1" DataKeyNames="AddressId,AddressLine1"
onsorting="ListView1_Sorting" onsorted="ListView1_Sorted">
然后在后面的代码中你必须处理事件。因为Items集合上的DataItems总是为null而DataIndex和DisplayIndex没有设置为人们通常所期望的那样我们必须在排序之前使用所选Item的DataKeys.Store数据键并通过DatakEy集合进行排序搜索以匹配存储的datakey。见下文
private DataKey dk;
protected void ListView1_Sorting(object sender, ListViewSortEventArgs e)
{
dk= (ListView1.SelectedIndex > 0) ? ListView1.DataKeys[ListView1.SelectedIndex] : null;
}
protected void ListView1_Sorted(object sender, EventArgs e)
{
if (dk == null) return;
int i;
ListView1.DataBind();
for (i = 0; i < ListView1.DataKeys.Count; i++)
if(AreEqual(ListView1.DataKeys[i].Values,dk.Values)) break;
if (i >= ListView1.DataKeys.Count) return;
ListView1.SelectedIndex =i;
}
private bool AreEqual(System.Collections.Specialized.IOrderedDictionary x, System.Collections.Specialized.IOrderedDictionary y)
{
for (int i = 0; i < x.Count; i++)
if (!x[i].Equals(y[i])) return false;
return true;
}