【问题标题】:How to regain focus in application after drag and drop to grid拖放到网格后如何在应用程序中重新获得焦点
【发布时间】:2023-03-19 19:44:01
【问题描述】:

在我的应用程序中,我有一个包含两个面板的表单。一个面板内部是一个按钮。另一个里面是一个 DevExpress Grid 控件。网格由 3 列组成。您可以将值从一列拖到另一列进行复制。

我的问题是,每当我从一列拖放到另一列时,应用程序的焦点就会进入一个不寻常的状态。网格仍然集中;我可以将鼠标悬停在标题上,然后查看它们的正常反应。但是,应用程序的其余部分没有重点。将鼠标悬停在另一个面板中的按钮上没有反应,菜单或表单控件也没有反应。如果我单击该按钮,它的反应就像我单击了一个没有焦点的应用程序一样。我必须再次单击才能实际激活该按钮。除了网格之外的每个控件都相同。

我曾尝试在按钮和表单上使用 Activate() 和 Focus(),但无济于事。

namespace Company.StuffUploader
{
    public partial class ComputationGrid : DevExpress.XtraEditors.XtraUserControl
    {
        private BindingList<ComputationLinkModel> _links = new BindingList<ComputationLinkModel>();

        public List<ComputationLinkModel> ComputationLinkModels
        {
            get
            {
                return new List<ComputationLinkModel>(_links);
            }
        }

        public ComputationGrid()
        {
            InitializeComponent();
        }

        private void ComputationGrid_Load(object sender, EventArgs e)
        {
            _gridControl.DataSource = _links;
        }

        private DragDropEffects GetDragEffect(DragEventArgs e)
        {
            var text = e.Data.GetData("System.String") as string;
            if (text == null)
                return DragDropEffects.None;

            var link = GetLinkFromScreenPoint(new Point(e.X, e.Y));
            if (link == null)
                return DragDropEffects.None;

            var tokens = text.Split('\t');
            if (tokens.Count() != 2)
                return DragDropEffects.None;

            var dateString = link.movedate.ToString("yyyy-MM-dd");
            if (link.StuffSurfaceName == tokens[0] && dateString != tokens[1])
                return DragDropEffects.Move;
            else
                return DragDropEffects.None;
        }

        private ComputationLinkModel GetLinkFromScreenPoint(Point screenPt)
        {
            var pt = _gridControl.PointToClient(screenPt);
            var hitInfo = _gridView.CalcHitInfo(pt);
            return _gridView.GetRow(hitInfo.RowHandle) as ComputationLinkModel;
        }

        private void _gridControl_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {

                var hitInfo = _gridView.CalcHitInfo(e.Location);
                if (hitInfo == null || !hitInfo.InRowCell)
                    return;

                // Only allow dragging from target column
                if (hitInfo.Column.AbsoluteIndex != 0)
                    return;

                var link = _gridView.GetRow(hitInfo.RowHandle) as ComputationLinkModel;
                if (link == null)
                    return;

                var item = string.Format("{0}\t{1}", link.StuffSurfaceName, link.movedate.ToString("yyyy-MM-dd"));
                DoDragDrop(item, DragDropEffects.Move);
            }
        }

        private void _gridControl_DragOver(object sender, DragEventArgs e)
        {
            e.Effect = GetDragEffect(e);
        }

        private void _gridControl_DragDrop(object sender, DragEventArgs e)
        {
        }

        private void _gridControl_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = GetDragEffect(e);
        }

        private void _unlinkButton_Click(object sender, EventArgs e)
        {
        }
    }
}

【问题讨论】:

  • 显示一些代码。

标签: c# winforms drag-and-drop devexpress devexpress-windows-ui


【解决方案1】:

我发现了自己的问题。从 MouseDown 事件中调用 DoDragDrop() 似乎无法正常工作。正确的方法是从 MouseMove() 调用它。 documentation on MSDN 在其示例代码中暗示了这一点。

【讨论】:

    【解决方案2】:

    确保在 GridView 的 Mouse~ 事件处理程序中将 DXMouseEventArgs.Handled 属性设置为 true。它保证将禁止对这些事件的默认处理。查看此example 以了解如何执行此操作。

    【讨论】:

    • 我编辑了我的帖子以显示我的代码。在我使用的三个事件处理程序中,似乎没有一个事件参数有 Handled 属性可供我设置。
    • 我已经修改了我的问题中的代码。我之前上传了我意识到的错误代码。
    • 要将当前事件参数转换为DXMouseEventArgs(事件参数的实际类型),需要调用静态DXMouseEventArgs.GetMouseArgs方法。
    猜你喜欢
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 2011-03-08
    • 2017-09-27
    相关资源
    最近更新 更多