DataGridView右键单击

时间:2018-06-11 22:20:28

标签: c# datagridview

我正在建立一个小程序,作为DnD 5e的主动追踪器。在程序中,我试图使用DataGridView实现映射功能。我的目标是按如下方式实现UI:

  

当用户左键单击和/或拖动时,瓷砖将填充为白色,表示占地面积。如果用户右键单击和/或拖动,则图块将填充为黑色,表示墙壁。

以下是地图构建功能的代码,它在MouseUp上触发:

private void BuildMap(object sender, DataGridViewCellMouseEventArgs e)
    {
        if (isEditingMap)
        {
            if (e.Button == MouseButtons.Left) // <-- Functions as expected
            {
                DataGridViewCellStyle cellStyle = new DataGridViewCellStyle();
                cellStyle.BackColor = Color.White;
                foreach (DataGridViewCell cell in ((DataGridView)sender).SelectedCells)
                {
                    cell.Style = cellStyle;
                }
                dgvMap.ClearSelection();
            }
            else if (e.Button == MouseButtons.Right) // <-- Does not function
            {
                DataGridViewCellStyle cellStyle = new DataGridViewCellStyle();
                cellStyle.BackColor = Color.Black;
                foreach (DataGridViewCell cell in ((DataGridView)sender).SelectedCells)
                {
                    cell.Style = cellStyle;
                }
                dgvMap.ClearSelection();
            }
        }
    }

虽然此代码在左键单击并拖动时将单元格变为白色时按预期运行,但右键单击不会执行任何操作,因为没有单元格突出显示。我尝试使用以下代码解决此问题,该代码在MouseDown上触发:

private void EnsureHighlight(object sender, DataGridViewCellMouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            dgvMap.CurrentCell = dgvMap[e.ColumnIndex, e.RowIndex];
        }
    }

但是,只有鼠标右键单击的单元格才会突出显示。我尝试使用while循环而不是if语句,但这导致程序挂起(也许是无限循环?)

基本上,我正在寻找的最终结果是右键单击和/或拖动DataGridView,使其功能与左键单击和/或拖动相同。如何才能使此功能正常工作?

更新:我重构了我的代码,以便在按住鼠标按钮时,MouseDown触发布尔变量的更改为true。这使得与MouseLeave事件相关联的另一个函数能够在鼠标经过时选择单元格。虽然可以用这种方式绘制线条,但它仍然没有绘制我想要的类似盒子的选择。这是新代码:

private void EnsureHighlight(object sender, DataGridViewCellMouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            selecting = true;
        }
    }

    private void EnsureHighlight(object sender, DataGridViewCellEventArgs e)
    {
        if(selecting)
        {
            dgvMap.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected = true;
        }
    }

0 个答案:

没有答案