【问题标题】:Limiting DataGridView cell multi selection to only column or row将 DataGridView 单元格多选限制为仅列或行
【发布时间】:2012-03-07 23:22:32
【问题描述】:

我有一个包含许多列和行的 DataGridView。我启用了MutliSelect,但这允许选择所有单元格。

我想限制垂直、水平、整行或整列的选择,但绝不要将两者混合。用户可以从任意单元格开始拖动,然后垂直或水平拖动来选择。

这里有一个小图表来说明它是否有帮助。

【问题讨论】:

  • 有趣。我觉得您需要多考虑一下您希望网格如何对用户交互做出反应。更具体地说,在您的第四个示例中,看起来用户可能单击了“Bob Acri”(标题),然后按住 shift 单击了“Mr. Scruff”。你希望电网在那个时候做什么?只选择“Bob Acri”?只选择“Mr. Scruff”?在第一个示例中创建选择?还有什么?最后一个例子也可以问同样的问题,用户可能有一个合法的选择,然后按 ctrl-click 一些非法的东西。最终结果应该是什么?
  • 我也不明白你为什么会想要这个限制。如果第三个例子中的部分行选择是合法的,为什么第四个例子中的多部分行选择是非法的?
  • @ChuckWilbur 垂直选择用于批量重命名,例如,如果用户想要选择一堆歌曲专辑并将它们全部编辑为相同的值,他们可以这样做。部分和全部水平选择将用于各种过滤功能。
  • 嘿,Corey,您找到解决方案了吗?如果可以,可以分享一下吗?

标签: c# datagridview


【解决方案1】:

Here's the brute force method - when the selection changes, de-select any cells that fall outside the current row/column selection:

int _selectedRow = -1;
int _selectedColumn = -1;
private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
    switch (dataGridView1.SelectedCells.Count)
    {
        case 0:
            // store no current selection
            _selectedRow = -1;
            _selectedColumn = -1;
            return;
        case 1:
            // store starting point for multi-select
            _selectedRow = dataGridView1.SelectedCells[0].RowIndex;
            _selectedColumn = dataGridView1.SelectedCells[0].ColumnIndex;
            return;
    }

    foreach (DataGridViewCell cell in dataGridView1.SelectedCells)
    {
        if (cell.RowIndex == _selectedRow)
        {
            if (cell.ColumnIndex != _selectedColumn)
            {
                _selectedColumn = -1;
            }
        }
        else if (cell.ColumnIndex == _selectedColumn)
        {
            if (cell.RowIndex != _selectedRow)
            {
                _selectedRow = -1;
            }
        }
        // otherwise the cell selection is illegal - de-select
        else cell.Selected = false;
    }
}

【讨论】:

  • 我有一个不同的使用场景(仅多选特定列)。我能够根据我的意图快速修改此代码。这应该被评为正确答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多