Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.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
Asp.net 如何处理可排序列表视图的SelectedIndex?_Asp.net_Listview_Sorting - Fatal编程技术网

Asp.net 如何处理可排序列表视图的SelectedIndex?

Asp.net 如何处理可排序列表视图的SelectedIndex?,asp.net,listview,sorting,Asp.net,Listview,Sorting,我有一个可排序的asp.net ListView 我有一个带有“选择”命令名的按钮。当我点击按钮时,相应的行被选中。如果单击排序标题,ListView将进行排序,但所选索引将保持不变。换句话说,如果单击第二行,则仍会选择排序第二行 有没有办法让ListView在排序后选择适当的行,这样,如果我单击某个项目,则仍然会选择排序相同的项目,但位置会根据排序的不同而有所不同?您必须以编程方式执行此操作-尽管解决方案有些麻烦。 第一步是在ListView中定义数据键和排序事件,如下所示 <asp

我有一个可排序的asp.net ListView

我有一个带有“选择”命令名的按钮。当我点击按钮时,相应的行被选中。如果单击排序标题,ListView将进行排序,但所选索引将保持不变。换句话说,如果单击第二行,则仍会选择排序第二行


有没有办法让ListView在排序后选择适当的行,这样,如果我单击某个项目,则仍然会选择排序相同的项目,但位置会根据排序的不同而有所不同?

您必须以编程方式执行此操作-尽管解决方案有些麻烦。 第一步是在ListView中定义数据键和排序事件,如下所示

  <asp:ListView ID="ListView1" runat="server"  DataSourceID="SqlDataSource1"  DataKeyNames="AddressId,AddressLine1"
            onsorting="ListView1_Sorting" onsorted="ListView1_Sorted">

然后在后面的代码中,您必须处理事件。由于Items集合上的DataItems始终为null,并且DataIndex和DisplayIndex未设置为人们通常期望的值,因此我们必须使用datakey。在排序之前和之后,通过datakey集合存储选定项的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;
        }
私有数据密钥dk;
受保护的无效ListView1_排序(对象发送方,ListViewSortEventArgs e)
{
dk=(ListView1.SelectedIndex>0)?ListView1.DataKeys[ListView1.SelectedIndex]:空;
}
受保护的无效列表视图1_排序(对象发送方、事件参数e)
{
如果(dk==null)返回;
int i;
ListView1.DataBind();
对于(i=0;i=ListView1.DataKeys.Count)返回;
ListView1.SelectedIndex=i;
}
私有布尔值相等(System.Collections.Specialized.IORDeredictionary x、System.Collections.Specialized.IORDeredictionary y)
{
对于(int i=0;i
谢谢,我开始走这条路,但希望控件中有更简单的构建。