DataGrid 选择一行中的单元格

3

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

例如,用户可以执行以下操作:

enter image description here

他不能做的事情:

enter image description here

我看到了这个,但不知道如何将其用于我的问题:https://dev59.com/jXA75IYBdhLWcg3w49YR#3072929 我想在DataGrid上使用SelectionChanged,但当我更改所选单元格时它不会触发,只有SelectedCellsChanged,并且没有Handled-Property。
编辑
当我使用ethicallogics的解决方案时,我得到了: enter image description here 我选择了整行..这不是我想要的。
5个回答

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

我在WPF中使用的是DataGrid而不是DataGridView!! - Karl_Schuhmann
这正是我所需要的! - mrhotroad

1
如果我的猜测是正确的:您想要的是
1)允许用户从整个网格中选择一个单元格。
2)在第一次选择后,您希望用户不选择任何其他行中的单元格。
3)如果用户想要选择多个单元格,则可以在他选择第一个单元格的同一行中这样做。
我不知道确切的解决方案或没有任何代码来指导您。但是,如果可以的话,在第一次选择时禁用其他行。

0

试试这个

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

我只能选择一个单元格,但我想选择一行中的多个单元格,而不是整行。 - Karl_Schuhmann

0

我目前正在开发类似的项目,为了获取每个记录,我创建了字符串变量。我使用以下代码行:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接