请教 wpf关于datagrid如何获取上一行/下一行的问题

ccb8888 2014-03-21 09:42:18

<DataGrid Name="DGList2" AutoGenerateColumns="False" HorizontalGridLinesBrush="#FFDCD5D5" VerticalGridLinesBrush="#FFDCD5D5" SelectionUnit="FullRow" IsReadOnly="True" >
<DataGrid.Columns >
<DataGridTextColumn Header="ID" Visibility="Collapsed" Width="100" Binding="{Binding ID}"/>
<DataGridTextColumn Header="公共类型" Width="100" Binding="{Binding FTopName}"/>
<DataGridTemplateColumn Header="排序" Width="100*" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Image Height="23" Width="15" Grid.Column="0" Cursor="Hand" Source="/Images/up.ico" MouseLeftButtonDown="Image_MouseLeftButtonDown_1" ></Image>
<Image Height="23" Width="15" Grid.Column="1" Cursor="Hand" Source="/Images/down.ico" MouseLeftButtonDown="Image_MouseLeftButtonDown" ></Image>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>


当我点击排序按钮时,如何获取当前按钮所在行的下一行的数据或者上一行的数据
...全文
139 点赞 收藏 12
写回复
12 条回复
欢乐的小猪 2014年03月21日
引用 7 楼 ccb8888 的回复:
[quote=引用 3 楼 hbu_pig 的回复:] DataGrid.SelectedIndex
由于没有捕捉到当前行。。所以DataGrid.SelectedIndex返回的是-1[/quote]那就index不等于-1的时候才可以上一行下一行。。
回复 点赞
michaelbob518 2014年03月21日
刚学WPF ..帮顶下..
回复 点赞
ccb8888 2014年03月21日
引用 5 楼 zhengnan2012 的回复:
取得当前的,然后再找前一行,后一行, 注意判断是否是第一行和最后一行.
思路是对。。就是代码实现可能比较麻烦!
回复 点赞
ccb8888 2014年03月21日
引用 3 楼 hbu_pig 的回复:
DataGrid.SelectedIndex
由于没有捕捉到当前行。。所以DataGrid.SelectedIndex返回的是-1
回复 点赞
小猪八Q 2014年03月21日
引用 2 楼 ccb8888 的回复:
[quote=引用 1 楼 jimil 的回复:] 说思路,代码自己找一下哈, 取得当前行号,行号+1,确定+1为数据行,取得+1数据
现在有一个难题。就是取得当前行号的难题,由于我是直接点击那个向上或向下按钮,DataGrid没有捕捉到选中的行。[/quote] 一种方法是在image为tag属性绑定当前行的数据{Binding},在事件中通过该数据,获取其在数据集合中的索引 第二种方法是通过HitTest,通过命中测试,找到对应对象
回复 点赞
zhengnan2012 2014年03月21日
取得当前的,然后再找前一行,后一行, 注意判断是否是第一行和最后一行.
回复 点赞
jimil 2014年03月21日
添加 CommandArgument="<%# ((GridViewRow) Container).RowIndex %> 取得 int i = Convert.ToInt32(e.CommandArgument.ToString());//得到行号
回复 点赞
欢乐的小猪 2014年03月21日
DataGrid.SelectedIndex
回复 点赞
ccb8888 2014年03月21日
引用 1 楼 jimil 的回复:
说思路,代码自己找一下哈, 取得当前行号,行号+1,确定+1为数据行,取得+1数据
现在有一个难题。就是取得当前行号的难题,由于我是直接点击那个向上或向下按钮,DataGrid没有捕捉到选中的行。
回复 点赞
jimil 2014年03月21日
说思路,代码自己找一下哈, 取得当前行号,行号+1,确定+1为数据行,取得+1数据
回复 点赞
ccb8888 2014年03月21日
上面代码多写了一句没用的。。重新粘贴

private void Image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            var currentObj = (Model.YCommonTypeList)((Image)sender).DataContext;
            var dgList = (List<Model.YCommonTypeList>)DGList2.ItemsSource;
            int curIdex = dgList.IndexOf(currentObj);
            if (curIdex == 0) {
                MessageBox.Show("当前是第一行,操作失败");
                return;
            }
            var otherObj = (Model.YCommonTypeList)DGList2.Items[curIdex - 1];
            var temp = otherObj.FOrder;            
            otherObj.FOrder = currentObj.FOrder;
            currentObj.FOrder = temp;
            bllCMT.Update(otherObj);            
            bllCMT.Update(currentObj);            
            DataBind();
            
        }
回复 点赞
ccb8888 2014年03月21日
终于找到解决方法,共享一下:主要思路都是通过找index来实现!

private void Image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            var currentObj = (Model.YCommonTypeList)((Image)sender).DataContext;
            var dgList = (List<Model.YCommonTypeList>)DGList2.ItemsSource;
            int curIdex = dgList.IndexOf(currentObj);
            if (curIdex == 0) {
                MessageBox.Show("当前是第一行,操作失败");
                return;
            }
            var otherObj = (Model.YCommonTypeList)DGList2.Items[curIdex - 1];
            var temp = otherObj.FOrder;
            var otherOrder = otherObj.FOrder;            
            otherObj.FOrder = currentObj.FOrder;
            currentObj.FOrder = temp;
            bllCMT.Update(otherObj);            
            bllCMT.Update(currentObj);            
            DataBind();
            
        }
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.4w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告