C# VS中使用reogrid插件如何时时获取选中单元格的坐标位置

C# VS中使用reogrid插件如何时时获取选中单元格的坐标位置

目标是:在单元格右键,这时单元格处于选中状态,可以得到行号和列号,判断行号和列号的范围,决定执行右键弹出菜单。(通过添加 ContextMenuStrip,已经可以实现右键弹出,不想让它在任何一个单元格右键都弹出,是否还有更好的方法,请指导)

// 以下是创建右键菜单对象-----------------------------------------
            var contextMenu = new ContextMenuStrip();

            // 创建菜单项
            var menuItem1 = new ToolStripMenuItem("等值向右填充");
            var menuItem2 = new ToolStripMenuItem("等距填充");
            var menuItem3 = new ToolStripMenuItem("衰减填充");

            // 将菜单项添加到右键菜单
            contextMenu.Items.Add(menuItem1);
            contextMenu.Items.Add(menuItem2);
            contextMenu.Items.Add(menuItem3);
            // 将右键菜单关联到 ReoGrid 控件
            reoGridControl1.ContextMenuStrip = contextMenu;

可以重载一下ReoGridControl,实现鼠标点击和右键菜单的控制。将控件类型改成MyGrid即可,
private MyGrid reoGridControl1;
其他不变。测试可用:

img

    class MyGrid :  unvell.ReoGrid.ReoGridControl
    {
        ContextMenuStrip m_menu;
        //
        // 摘要:
        //     Overrides mouse-down events
        //
        // 参数:
        //   e:
        //     Argument of mouse pressing event.
        protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e)
        {
            if (m_menu == null)
                m_menu = ContextMenuStrip;

            ContextMenuStrip = null;// contextMenu;
            base.OnMouseDown(e);

            if (e.Button == MouseButtons.Right)
            {
                // 获取选中的单元格
                var cellPos = CurrentWorksheet.FocusPos; 
                if (cellPos != null)
                {
                    // 获取选中单元格的行号和列号
                    var row = cellPos.Row;
                    var col = cellPos.Col;

                    // 判断行号和列号的范围,决定是否执行右键弹出菜单
                    if (row >= 0 && row < 2 && col >= 0 && col < 2)
                    {
                        // 执行右键弹出菜单的逻辑
                        ContextMenuStrip = m_menu;
                    }
                }
                if(ContextMenuStrip != null)
                    base.OnMouseDown(e);
            }
        }

    }


基于new bing部分指引作答:
要在C#中使用ReoGrid插件实时获取选中单元格的坐标位置,您可以使用ReoGrid控件的SelectionRangeChanged事件。该事件在选中单元格范围发生更改时触发,您可以在事件处理程序中获取选中单元格的坐标位置。

以下是一个示例代码,演示如何实现这一目标:

using unvell.ReoGrid;
using unvell.ReoGrid.Events;

// 在窗体或控件的构造函数或其他适当的位置进行以下代码设置
ReoGridControl reoGridControl1 = new ReoGridControl();
reoGridControl1.SelectionRangeChanged += ReoGridControl1_SelectionRangeChanged;

// SelectionRangeChanged事件处理程序
private void ReoGridControl1_SelectionRangeChanged(object sender, RangeEventArgs e)
{
    if (e.Range.Rows == 1 && e.Range.Cols == 1)
    {
        int selectedRow = e.Range.Row;    // 获取选中单元格的行号
        int selectedCol = e.Range.Col;    // 获取选中单元格的列号

        // 在这里执行行号和列号的范围判断,决定是否执行右键弹出菜单
        // 根据需要进行相应的逻辑处理
    }
}

在上述代码中,我们将SelectionRangeChanged事件绑定到ReoGrid控件的SelectionRangeChanged事件处理程序。当选中的单元格范围发生更改时,事件处理程序将被调用。

在事件处理程序中,我们首先检查选中单元格的行数和列数是否都为1,以确保只有一个单元格被选中。然后,我们可以使用e.Range.Row和e.Range.Col属性获取选中单元格的行号和列号。

接下来,您可以在该事件处理程序中执行行号和列号的范围判断,以决定是否执行右键弹出菜单的逻辑。您可以根据自己的需求进行相应的操作。

在上述示例中,我们假设只有一个单元格可以被选中。如果您希望处理多个选中单元格的情况,您可以使用e.Range的其他属性,如e.Range.Rows和e.Range.Cols来获取选中范围的行数和列数,并相应地处理。

可参考
在窗体或控件中,添加一个ReoGrid控件,例如ReoGridControl
在窗体或控件的构造函数中,为ReoGridControl控件的MouseDown事件添加事件处理程序。

public YourForm()
{
    InitializeComponent();

    // 添加MouseDown事件处理程序
    reoGridControl1.MouseDown += ReoGridControl1_MouseDown;
}

private void ReoGridControl1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        // 获取鼠标点击的位置
        var pos = reoGridControl1.PointToClient(Cursor.Position);

        // 获取选中的单元格
        var cell = reoGridControl1.GetCellFromPoint(pos.X, pos.Y);

        if (cell != null)
        {
            // 获取选中单元格的行号和列号
            var row = cell.Row;
            var col = cell.Column;

            // 判断行号和列号的范围,决定是否执行右键弹出菜单
            if (row >= 0 && row < 10 && col >= 0 && col < 10)
            {
                // 执行右键弹出菜单的逻辑
                // ...
            }
        }
    }
}

看看有没有 hint test 一类的方法可以判断某个坐标属于哪个单元格
当前鼠标坐标的获取可以用 Cursor 对象,也可以在Mouse_Up里,用e 来获取

答案参考ChatGPT Plus版,整理汇总。希望能帮助你解决问题要实时获取选中单元格的坐标位置,你可以使用reogrid插件中提供的事件和方法。以下是一个示例,演示如何在C#中获取选中单元格的坐标位置并判断行号和列号的范围:

  1. 添加事件处理程序:首先,你需要为ReoGrid控件的SelectionRangeChanged事件添加一个事件处理程序。该事件在选中范围更改时触发。
// 添加SelectionRangeChanged事件处理程序
reoGridControl1.SelectionRangeChanged += ReoGridControl1_SelectionRangeChanged;
  1. 获取选中单元格的坐标位置:在SelectionRangeChanged事件处理程序中,你可以使用SelectionRange属性获取选中范围的坐标位置。可以通过SelectionRange属性的Start属性获取起始单元格的坐标。
private void ReoGridControl1_SelectionRangeChanged(object sender, unvell.ReoGrid.Events.RangeEventArgs e)
{
    var grid = (ReoGridControl)sender;
    var selectionRange = grid.SelectionRange;

    int startRow = selectionRange.StartRow;
    int startCol = selectionRange.StartCol;

    // 在这里可以进行行号和列号的范围判断,决定是否执行右键弹出菜单
    // ...
}
  1. 判断行号和列号的范围:在获取到选中单元格的行号和列号后,你可以根据需要进行判断。例如,可以使用if语句检查行号和列号的范围,然后决定是否执行右键弹出菜单。
private void ReoGridControl1_SelectionRangeChanged(object sender, unvell.ReoGrid.Events.RangeEventArgs e)
{
    var grid = (ReoGridControl)sender;
    var selectionRange = grid.SelectionRange;

    int startRow = selectionRange.StartRow;
    int startCol = selectionRange.StartCol;

    // 在这里可以进行行号和列号的范围判断,决定是否执行右键弹出菜单
    if (startRow >= 0 && startRow <= 10 && startCol >= 0 && startCol <= 10)
    {
        // 显示右键菜单
        contextMenu.Show(grid, e.GridPosition);
    }
}

在上面的示例中,我们假设行号和列号的范围是0到10。你可以根据实际需求进行修改。

请注意,上述代码中的contextMenu是你创建的右键菜单对象,它已经与ReoGrid控件关联。确保在使用Show方法显示右键菜单时,将e.GridPosition作为参数传递,以确保菜单显示在正确的位置。

这样,当选中的单元格的行号和列号满足范围条件时,右键菜单将会弹出。

提供参考思路和示例代码:

#获取选中单元格的坐标位置:
// 获取选中单元格的行号和列号  
int row = reoGridControl1.ActiveCell.Row;  
int column = reoGridControl1.ActiveCell.Column;
#使用这些坐标值来判断其是否在你想要执行右键弹出菜单的范围内
// 判断选中单元格是否在第一列  
if (column == 0)  
{  
    // 执行右键弹出菜单  
    contextMenu.Show(reoGridControl1, reoGridControl1.PointToClient(Cursor.Position));  
}
#如有帮助,恭请采纳

// 在Form的构造函数或Load事件中添加以下代码

// 添加ReoGrid控件的MouseDown事件处理程序
reoGridControl1.MouseDown += ReoGridControl1_MouseDown;

// 创建右键菜单对象
var contextMenu = new ContextMenuStrip();

// 创建菜单项
var menuItem1 = new ToolStripMenuItem("等值向右填充");
var menuItem2 = new ToolStripMenuItem("等距填充");
var menuItem3 = new ToolStripMenuItem("衰减填充");

// 将菜单项添加到右键菜单
contextMenu.Items.Add(menuItem1);
contextMenu.Items.Add(menuItem2);
contextMenu.Items.Add(menuItem3);

// 将右键菜单关联到 ReoGrid 控件
reoGridControl1.ContextMenuStrip = contextMenu;

// 右键菜单项点击事件处理程序
menuItem1.Click += MenuItem1_Click;
menuItem2.Click += MenuItem2_Click;
menuItem3.Click += MenuItem3_Click;

// ReoGrid控件的MouseDown事件处理程序
private void ReoGridControl1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        // 获取鼠标点击的坐标位置
        var point = reoGridControl1.PointToClient(MousePosition);

        // 获取选中的单元格
        var cell = reoGridControl1.GetCellFromPoint(point.X, point.Y);

        if (cell != null)
        {
            // 获取选中单元格的行号和列号
            int row = cell.Row;
            int col = cell.Column;

            // 判断行号和列号的范围,决定是否执行右键菜单弹出操作
            if (row >= 0 && row < reoGridControl1.RowCount && col >= 0 && col < reoGridControl1.ColumnCount)
            {
                // 执行右键菜单弹出操作
                reoGridControl1.ContextMenuStrip.Show(reoGridControl1, point);
            }
        }
    }
}

// 右键菜单项点击事件处理程序
private void MenuItem1_Click(object sender, EventArgs e)
{
    // 等值向右填充菜单项点击处理逻辑
}

private void MenuItem2_Click(object sender, EventArgs e)
{
    // 等距填充菜单项点击处理逻辑
}

private void MenuItem3_Click(object sender, EventArgs e)
{
    // 衰减填充菜单项点击处理逻辑
}