C#-DataGrid的使用(三)

简介: C#-DataGrid的使用

我们之前在DataGrid使用的第一部分中,使用到了拖拽事件,它能够实现用鼠标拖拽表格的行,对顺序进行重新排列,但是这个不够完善,当你在行中使用模板,添加了按钮,或者下拉框等控件的时候,对按钮的点击事件有影响,这里我们重新优化下代码。

之前我们是在鼠标移动的时候,如果左键按下,直接进入拖拽状态中,这就导致行中按钮的点击没办法执行,所以我们加一个判断,让鼠标移动一定的距离之后进入拖拽状态,可以避免此问题,另外,我们这里把鼠标事件写到datagridrow上,下面是参考代码:

//datagrid.xaml
<DataGrid.Resource>
     <Style TargetType="DataGridRow">
         <Setter Property="AllowDrop" Value="True"></Setter>
         <EventSetter Property="PreviewMouseLeftButtonDown" Handle="DataGridRow_PreviewMouseLeftButtonDown"></EventSetter>
         <EventSetter Property="PreviewMouseLeftButtonDown" Handle="DataGridRow_PreviewMouseMove"></EventSetter>
        <EventSetter Property="PreviewMouseLeftButtonDown" Handle="DataGridRow_Drop"></EventSetter>
     </Style>
</DataGrid.Resource>
//datagrid.xaml.cs
private DataGridRow _draggedItem;
private Point _startPoint;
private void DataGridRow_PreviewMouseLeftButtonDown(object sender,MouseButtonEventArgs e){
    //记录鼠标开始的位置
    _startPoint=e.GetPosition(this);
}
private void DataGridRow_PreviewMouseMove(object sender,MouseEventArgs e){
    try{
        if(e.leftButton==MouseButtonState.Pressed){
            //判断鼠标移动的位置大于某个值进入拖拽状态
            Point endPoint=e.GetPosition(this);
            if(Math.Abs(endPoint.Y-_startPoint.Y)>5){
                if(sender is DataGridRow){
                    _draggedItem=(sender as DataGridRow);
                    DragDrop.DoDragDrop(_draggedItem,_draggedItem.DataContext,DragDropEffects.Move);
                    _draggedItem.IsSelected=true;
                }
            }
        }
    }
    catch(Exception ex){
    }
}
private void DataGridRow_Drop(object sender,DragEventArgs e){
    try{
        if(sender is DataGridRow){
            DataGridRow targetRow=sender as DataGridRow;
            int preIndex=_draggedItem.GetIndex();
            int index=targetRow.GetIndex();
            //datagrid绑定的数据源
            ObservableCollection<BindingModel> items=(this.DataContext as viewModel).bindingItems;
           if(index>items.Count-1) return;
           BindingModel item=null;
           for(int i=0;i<items.Count;i++){
               if(i==preIndex){
                   item=item[i];
               }
           }
           if(item!=null){
               items.RemoveAt(preIndex);
               items.Insert(index,item);
           }
        }
    }
    catch(Exception ex){
    }
}
目录
相关文章
|
3月前
|
前端开发 测试技术 C#
WPF/C#:在DataGrid中显示选择框
WPF/C#:在DataGrid中显示选择框
58 0
|
数据可视化
C#-DataGrid的使用(二)
DataGrid的使用
52 0
|
SQL 数据库 C#
C#中将DataGrid绑定到SQL Server数据库,显示数据库中的数据
C#中将DataGrid绑定到SQL Server数据库,显示数据库中的数据
C#中将DataGrid绑定到SQL Server数据库,显示数据库中的数据
|
SQL 数据库 C#
C#中将DataGrid上的修改同步到SQL Server数据库中
C#中将DataGrid上的修改同步到SQL Server数据库中
C# DataGrid 控件在winform里显示行号
#region 行绘制事件 ,为DataGridView每行写上序号 /// /// 行绘制事件 ,为DataGridView每行写上序号 /// /// ...
1028 0
|
14天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
29 3
|
1月前
|
安全 C# 数据安全/隐私保护
实现C#编程文件夹加锁保护
【10月更文挑战第16天】本文介绍了两种用 C# 实现文件夹保护的方法:一是通过设置文件系统权限,阻止普通用户访问;二是使用加密技术,对文件夹中的文件进行加密,防止未授权访问。提供了示例代码和使用方法,适用于不同安全需求的场景。
101 0