C#-DataGrid的使用(三)

2023-06-20 125 0

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

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

//datagrid.xaml
<DataGrid.Resource>
     <Style TargetType="DataGridRow">
         <Setter Property="AllowDrop" Value="True"></Setter>
         <EventSetter Event="PreviewMouseLeftButtonDown" Handle="DataGridRow_PreviewMouseLeftButtonDown"></EventSetter>
         <EventSetter Event="PreviewMouseMove" Handle="DataGridRow_PreviewMouseMove"></EventSetter>
        <EventSetter Event="Drop" 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){
    }
}

相关文章

C#-获取常用的路径
C#-DataGridColumn只能输入数字
C#-DataGridComboBoxColumn数据绑定
C#-Devexpress GridControl 标题内容居中
C#-Group By 的使用
【转】C#-Blazor组件间通信

发布评论