我正在建立一个小程序,作为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;
}
}