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){
    }
}
目录
相关文章
|
1月前
|
前端开发 测试技术 C#
WPF/C#:在DataGrid中显示选择框
WPF/C#:在DataGrid中显示选择框
37 0
|
12月前
C#-DataGrid的使用(一)
DataGrid的使用
67 0
|
12月前
|
数据可视化
C#-DataGrid的使用(二)
DataGrid的使用
43 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每行写上序号 /// /// ...
1019 0
|
4月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
159 3
|
4月前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
173 3