前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#-DataGrid的使用(三)

C#-DataGrid的使用(三)

原创
作者头像
kdyonly
发布2023-06-20 18:41:23
1350
发布2023-06-20 18:41:23
举报
文章被收录于专栏:个人编程笔记个人编程笔记

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

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

代码语言:javascript
复制
//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>
代码语言:javascript
复制
//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){
    }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com