DataRowView 对象在从 DataGrid 获取值时获取空值
DataRowView object getting null value at time of getting value from DataGrid
场景是我想从所选行的 onMouseDoubleClick 事件中获取值。我将该行投射到 DataRowView,但该对象没有任何价值。在调试时,当我将光标悬停在 SelectedItem 上时,它会显示值但不会将其投射到 DataRowView。使用来自 cs 代码的 linq 填充 gridview。没有使用数据源。
.cs代码:
private void _gvDoctorVisit_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
DataRowView row = _gvDoctorVisit.SelectedItem as DataRowView;
int visitid = Convert.ToInt32(row.Row["visit_id"]);
MessageBox.Show(visitid.ToString());
}
.xaml 代码:
<DataGrid x:Name="_gvDoctorVisit" AutoGenerateColumns="False" EnableRowVirtualization="True" Margin="10,118,10,10" RowDetailsVisibilityMode="VisibleWhenSelected" CanUserReorderColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" IsReadOnly="True" HorizontalScrollBarVisibility="Visible" MouseDoubleClick="_gvDoctorVisit_MouseDoubleClick" >
<DataGrid.Columns>
<DataGridTextColumn x:Name="visit_idColumn" Binding="{Binding visit_id}" Header="Visit ID" IsReadOnly="True" Width="100"/>
<DataGridTextColumn x:Name="person_idColumn" Binding="{Binding Patient_name}" Header="Patient Name" IsReadOnly="True" Width="200"/>
<DataGridTextColumn x:Name="visit_timeColumn" Binding="{Binding visit_time}" Header="Visit Time" IsReadOnly="True" Width="140" />
<DataGridTextColumn x:Name="visit_typeColumn" Binding="{Binding visit_type}" Header="Visit Type" IsReadOnly="True" Width="733"/>
</DataGrid.Columns>
</DataGrid>
不要使用与 WPF 的 DataGrid 无关的 DataRowView ...。您一定在考虑不同的框架。
如果您只是通过将 ItemsSource 属性 设置为从 Linq 代码中获得的对象集合来填充 DataGrid 上的数据,则 SelectedItem 的类型将与你通过了。所以,你应该能够做到以下几点。 (如果您有 class,请随意将 "dynamic" 替换为您的实际 class。否则,您可以保持原样。)
private void _gvDoctorVisit_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
int visitid = ((dynamic)_gvDoctorVisit.SelectedItem).visit_id;
MessageBox.Show(visitid.ToString());
}
场景是我想从所选行的 onMouseDoubleClick 事件中获取值。我将该行投射到 DataRowView,但该对象没有任何价值。在调试时,当我将光标悬停在 SelectedItem 上时,它会显示值但不会将其投射到 DataRowView。使用来自 cs 代码的 linq 填充 gridview。没有使用数据源。
.cs代码:
private void _gvDoctorVisit_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
DataRowView row = _gvDoctorVisit.SelectedItem as DataRowView;
int visitid = Convert.ToInt32(row.Row["visit_id"]);
MessageBox.Show(visitid.ToString());
}
.xaml 代码:
<DataGrid x:Name="_gvDoctorVisit" AutoGenerateColumns="False" EnableRowVirtualization="True" Margin="10,118,10,10" RowDetailsVisibilityMode="VisibleWhenSelected" CanUserReorderColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" IsReadOnly="True" HorizontalScrollBarVisibility="Visible" MouseDoubleClick="_gvDoctorVisit_MouseDoubleClick" >
<DataGrid.Columns>
<DataGridTextColumn x:Name="visit_idColumn" Binding="{Binding visit_id}" Header="Visit ID" IsReadOnly="True" Width="100"/>
<DataGridTextColumn x:Name="person_idColumn" Binding="{Binding Patient_name}" Header="Patient Name" IsReadOnly="True" Width="200"/>
<DataGridTextColumn x:Name="visit_timeColumn" Binding="{Binding visit_time}" Header="Visit Time" IsReadOnly="True" Width="140" />
<DataGridTextColumn x:Name="visit_typeColumn" Binding="{Binding visit_type}" Header="Visit Type" IsReadOnly="True" Width="733"/>
</DataGrid.Columns>
</DataGrid>
不要使用与 WPF 的 DataGrid 无关的 DataRowView ...。您一定在考虑不同的框架。
如果您只是通过将 ItemsSource 属性 设置为从 Linq 代码中获得的对象集合来填充 DataGrid 上的数据,则 SelectedItem 的类型将与你通过了。所以,你应该能够做到以下几点。 (如果您有 class,请随意将 "dynamic" 替换为您的实际 class。否则,您可以保持原样。)
private void _gvDoctorVisit_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
int visitid = ((dynamic)_gvDoctorVisit.SelectedItem).visit_id;
MessageBox.Show(visitid.ToString());
}