数据网格:如何操作所选项目
本文关键字:操作 选项 项目 网格 数据网 何操作 数据 | 更新日期: 2023-09-27 18:30:06
这必须很简单,但我所有的搜索都会导致基于绑定的解决方案,但事实并非如此。
我有一个DataGrid
,其中有一个DataGridComboBoxColumn
.此列的 ItemsSource
属性绑定到字符串数组。我在启动中使用循环通过以下代码为 DataGrid 的每一行设置此列的SelectedItem
:
for (int i = 0; i < dgResults.Items.Count; i++)
{
var x = dgResults.GetCell(i, 0).Content as System.Windows.Controls.ComboBox;
x.SelectedItem = "One of the items of my array";
}
GetCell()
是我从这里抓取的扩展方法。
现在的问题是,当我单击此列的特定单元格时,下拉列表出现在单元格中,并正确填充了所有数组项,但下拉列表的当前文本为空,即它不会自动从下拉列表中选择相应的项。我错过了什么?
编辑
以下是我的数据网格的相关部分:
<DataGrid x:Name="dgResults" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridComboBoxColumn ItemsSource="{StaticResource ReminderValues }" />
</DataGrid.Columns>
</DataGrid>
如您所见,此特定列未绑定到底层DataColumn
或其他内容,尽管整个 DataGrid 绑定到 DataTable。另外,我确信这不是拼写问题。
睡了一会儿终于想通了。如果网格中有一个未绑定DataGridComboBoxColumn
(即该列未绑定到基础数据源中的列(,并且其 ItemsSource
属性绑定到数组或其他内容,则必须将以下内容添加到DataGrid
声明中:
SelectedItemBinding="{Binding /}"
上面的斜杠字符 (/( 表示当前项本身,这就是我们希望我们的 SelectedItem 是什么。
现在,我的 DataGrid 正确显示值,一旦单元格获得焦点,ComboBox 就会出现,并选中正确的值。
如果你不打扰其他演员,你可以这样做
for (int i = 0; i < dgResults.Items.Count; i++)
{
var x = dgResults.GetCell(i, 0).Content as System.Windows.Controls.ComboBox;
var array = x.ItemsSource as string[] ;
x.SelectedItem = array.Where(s => s == "B").FirstOrDefault();
}
编辑:好的,这现在应该可以工作了
工作示例:XAML
<Window x:Class="simpletest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<x:Array x:Key="ReminderValues" Type="sys:String">
<sys:String>A</sys:String>
<sys:String>B</sys:String>
<sys:String>C</sys:String>
<sys:String>D</sys:String>
</x:Array>
<x:Array x:Key="count" Type="sys:String">
<sys:String>A</sys:String>
</x:Array>
</Window.Resources>
<Grid>
<DataGrid Name="dgResults" ItemsSource="{StaticResource count}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridComboBoxColumn ItemsSource="{StaticResource ReminderValues }" />
</DataGrid.Columns>
</DataGrid>
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="428,12,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
</Grid>
</Window>
.CS
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
for (int i = 0; i < dgResults.Items.Count; i++)
{
var x = dgResults.GetCell(i, 0).Content as System.Windows.Controls.ComboBox;
var array = x.ItemsSource as string[];
x.SelectedItem = array.Where(s => s == "B").FirstOrDefault();
}
}
}
若要测试您的代码示例是否实际有效,请尝试将其更改为 this 并运行您的应用程序:
for (int i = 0; i < dgResults.Items.Count; i++)
{
var x = dgResults.GetCell(i, 0).Content as System.Windows.Controls.ComboBox;
x.SelectedIndex = comboBoxItemsSource.Items.Count - 1;
}
如果ComboBox
es 都选择了最后一个选项,则此代码运行良好。如果没有,那么您有问题。如果它确实有效,问题可能是您与要选择的Items
集合中的string
不完全匹配......请记住,即使一个字符大小写错误,它也不会匹配,因此不会被选中。
如果上面的代码不起作用,那么也许您需要进一步测试您的GetCell
方法......您是否在此for
循环中放置了一个断点来验证x
确实是正确的单元格?