DEV中右键菜单如何只在非空单元格上显示?

本文详细介绍了如何在WinForm应用程序中精确控制GridView和TreeList控件的右键菜单显示逻辑。通过代码示例,展示了如何仅在点击非空行或节点时触发右键菜单,同时提供对菜单项可用性的条件限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

1. 开发时,我的winform程序中有很多gridview,我希望右键菜单只在我点击非空的行时才显示,点击其他空白区域时不显示;

2. 有一个树状导航图,treelist 中的节点都有右键菜单,我希望只在我点击这个节点时才显示右键菜单,点击treelist的空白位置不显示右键菜单。

实现:

1. 

      #region 右键菜单
        private void gvSlurry_MouseUp(object sender, MouseEventArgs e)
        {
            GridHitInfo _gridHI = gvSlurry.CalcHitInfo(new Point(e.X, e.Y));
            if (e.Button == MouseButtons.Right && _gridHI.RowHandle > 0)//根据当前选中的行数非空来确定右键菜单显示。
            {
                menuRow.Show(MousePosition);
            }
        }
        #endregion

        /// <summary>
        /// 右键菜单选项弹出条件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gvSlurry_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e)
        {
            int _select = gvSlurry.SelectedRowsCount;
            menuUpdate.Enabled = false;
            menuDelete.Enabled = false;
            if (_select == 1)
            {
                menuUpdate.Enabled = true;
                menuDelete.Enabled = true;
            }
            else if (_select > 1)
            {
                menuDelete.Enabled = true;
            }
        }

需要注意的是:

这里的右键菜单使用的是ContextMenuStrip控件;

GridControl下的ContextMenuStrip不绑定控件ContextMenuStrip1;

这里用到了GridView的两个事件,一个是MouseUp事件,一个是PopupMenuShowing事件。第二个事件是用来在菜单显示之前对菜单的现实条件做一些限制,比如说我这里的选中一条记录是右键删除和更新都可用,选中多条记录时右键只有删除可用。

2. 

        private void treeList1_MouseUp(object sender, MouseEventArgs e)
        {
            TreeList _tree = sender as TreeList;
            if (Equals(e.Button, MouseButtons.Right) &&
                Equals(ModifierKeys, Keys.None) &&
                Equals(treeList1.State, TreeListState.Regular))
            {
                Point _point = new Point(Cursor.Position.X, Cursor.Position.Y);
                TreeListHitInfo _hitInfo = _tree.CalcHitInfo(e.Location);
                if (_hitInfo.HitInfoType == HitInfoType.Cell)
                {
                    _tree.SetFocusedNode(_hitInfo.Node);
                }
                else
                {
                    return;
                }

                if (_tree.FocusedNode.HasChildren)
                {
                    popupMenu1.ShowPopup(_point);
                }
                else
                {
                    popupMenu2.ShowPopup(_point);
                }
            }
        }

 

转载于:https://www.cnblogs.com/Alex1994/p/9882848.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值