我正在编写一个预订应用程序,它利用 DataGridView 将 Y 轴上的可用房间和 X 轴上的可用时间列为列。
我希望用户能够拖动选择一个时间范围,但它必须一次限制为一行。
控制网格的突出显示方面,以便在鼠标移动时仅突出显示所需的行或在行边界内捕获鼠标是我想到的选项。欢迎任何帮助实施这些任务,甚至是处理任务的新方法!
我宁愿只使用发生鼠标按下事件的 DataRow 来捕获鼠标,不确定是否必须使用剪切矩形来实现这一点。
提前感谢您的帮助。
我正在编写一个预订应用程序,它利用 DataGridView 将 Y 轴上的可用房间和 X 轴上的可用时间列为列。
我希望用户能够拖动选择一个时间范围,但它必须一次限制为一行。
控制网格的突出显示方面,以便在鼠标移动时仅突出显示所需的行或在行边界内捕获鼠标是我想到的选项。欢迎任何帮助实施这些任务,甚至是处理任务的新方法!
我宁愿只使用发生鼠标按下事件的 DataRow 来捕获鼠标,不确定是否必须使用剪切矩形来实现这一点。
提前感谢您的帮助。
可能是写这个的更好的方法,但它有效。
private void dataGridView1_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e)
{
if (dataGridView1.SelectedCells.Count > 1)
{
//Retrieves the first cell selected
var startRow = dataGridView1.SelectedCells[dataGridView1.SelectedCells.Count - 1].RowIndex;
foreach (DataGridViewCell cell in dataGridView1.SelectedCells)
{
if (cell.RowIndex != startRow)
{
cell.Selected = false;
}
}
}
}
作为对 CellStateChanged 事件代码的改进,可以使用以下代码。
private void dataGridView1_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e)
{
if ((e.StateChanged == DataGridViewElementStates.Selected) && // Only handle it when the State that changed is Selected
(dataGridView1.SelectedCells.Count > 1))
{
// A LINQ query on the SelectedCells that does the same as the for-loop (might be easier to read, but harder to debug)
// Use either this or the for-loop, not both
if (dataGridView1.SelectedCells.Cast<DataGridViewCell>().Where(cell => cell.RowIndex != e.Cell.RowIndex).Count() > 0)
{
e.Cell.Selected = false;
}
/*
foreach (DataGridViewCell cell in dataGridView1.SelectedCells)
{
if (cell.RowIndex != e.Cell.RowIndex)
{
e.Cell.Selected = false;
break; // stop the loop as soon as we found one
}
}
*/
}
}
这个 for 循环的不同之处在于使用e.Cell
为参考点,RowIndex
因为e.Cell
是用户选择的单元格,设置为e.Cell.Selected
tofalse
而不是,cell.Selected
最后break;
在 for 循环中设置 a,因为在第一次RowIndex
不匹配后,我们可以停止检查。