【问题标题】:DataGrid Select Cells in only one RowDataGrid 仅在一行中选择单元格
【发布时间】:2013-12-14 17:44:05
【问题描述】:

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

例如,用户可以这样做:

他不应该做的事:

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

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

编辑

当我使用道德逻辑解决方案时,我得到:

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

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案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!!
    • 这正是我所需要的!
    【解决方案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;
        }
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

      3) 如果用户想要选择多个单元格,那么他可以这样做,但在他选择第一个单元格的同一行中。

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

          试试这个

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

          【讨论】:

          • 所以我只能选择一个单元格,但我想连续选择一个以上的单元格,而不是整行
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-07-01
          • 1970-01-01
          • 2016-05-28
          • 1970-01-01
          • 2022-06-14
          • 2014-11-01
          • 1970-01-01
          相关资源
          最近更新 更多