有没有办法让用户只在数据网格中选择一行
例如,用户应该这样做:
他不应该这样做:
我看到了这个,但它没有看到如何使用它来解决我的问题: https://stackoverflow.com/a/3072929/1764978
我想在DataGrid上使用SelectionChanged
,但是当我更改所选单元格时它不会触发,只有SelectedCellsChanged
且没有Handled
- 属性
当我使用ethicallogics解决方案时,我得到了:
我选择了一整行......那不是我想要的
答案 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
哪个记录将存储在变量中)。