DataGrid仅在一行中选择单元格

时间:2013-11-28 15:56:05

标签: c# wpf datagrid

有没有办法让用户只在数据网格中选择一行

例如,用户应该这样做:

enter image description here

他不应该这样做:

enter image description here

我看到了这个,但它没有看到如何使用它来解决我的问题: https://stackoverflow.com/a/3072929/1764978

我想在DataGrid上使用SelectionChanged,但是当我更改所选单元格时它不会触发,只有SelectedCellsChanged且没有Handled - 属性

修改

当我使用ethicallogics解决方案时,我得到了: enter image description here

我选择了一整行......那不是我想要的

5 个答案:

答案 0 :(得分:2)

这可能会得到优化,但这对我有用。

它跟踪第一个选定的项目,即行,如果在该行之外有选择,则删除整个选择(并将其替换为新选择的单元格)。可能会增强恢复初始选择,但我的用例并不需要。

无论如何,看看这是否适合你。

private object selectedItem;

private void DataGrid_OnSelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
    var dg = (sender as DataGrid);

    if (selectedItem == null)
        selectedItem = e.AddedCells.First().Item;

    var allInSameRow = e.AddedCells.All(info => info.Item == selectedItem);

    if (!allInSameRow)
    {
        dg.SelectedCells.Clear();
        selectedItem = null;
    }
}

答案 1 :(得分:1)

如果我的猜测是正确的:你想要的是

1)允许用户从整个网格中选择一个单元格。

2)首次选择后,您希望用户不要从任何其他行中选择任何单元格。

3)如果用户想要选择多个单元格,则允许他这样做,但是在他选择第一个单元格的同一行中。

我不知道确切的解决方案,或者我没有任何代码可以指导您。

但是如果你可以在第一次选择时禁用其他行。

答案 2 :(得分:1)

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;
    }
}

答案 3 :(得分:0)

试试这个

<DataGrid SelectionMode="Single" SelectionUnit="Cell"

答案 4 :(得分:0)

我目前正在做类似的事情,我正在为我想要的每条记录创建字符串变量。我使用这行代码:

string somename = ((DataRowView)DataGridName.SelectedItem).Row["ColumnName"].ToString();

此代码只从用户选择的行中获取一个单元格(它取决于ColumnName哪个记录将存储在变量中)。