WPF的DataGrid中如何获取当前被选定的行的第一个单元格的值?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF的DataGrid中如何获取当前被选定的行的第一个单元格的值?相关的知识,希望对你有一定的参考价值。
点击哪一行,就获得哪一行的编号
参考技术A private void dtList_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)var item = this.dtList.SelectedItem;
var id = (DataRowView)this.dtList.SelectedItem;
int bh = Convert.ToInt32(id["编号"]);
MessageBox.Show(bh.ToString() );
//这样绝对可以取到编号. 参考技术B 你的数据如果是绑定的
var item = dataGrid.SelectedItem as 你的数据类型;
if(item != null)
var id = item.你的编号那列对应的属性名称
本回答被提问者采纳
WPF DataGrid 选定的行样式
【中文标题】WPF DataGrid 选定的行样式【英文标题】:WPF DataGrid selected row style 【发布时间】:2011-05-31 04:59:04 【问题描述】:我遇到了一个非常愚蠢的问题 - 需要在 WPF DataGrid 中设置选定行的样式。
我想显示一个带有蓝色边框的矩形,而不是仅仅用某种颜色填充整行。
任何想法如何实现这一点?只是必须通过某种方式让它变得非常简单。
【问题讨论】:
【参考方案1】:试试这个
<DataGrid.Resources>
<SolidColorBrush x:Key="x:Static SystemColors.HighlightBrushKey" Color="Transparent"/>
<Style TargetType="x:Type DataGridRow">
<Setter Property="HeaderStyle">
<Setter.Value>
<Style TargetType="x:Type DataGridRowHeader">
<Setter Property="Visibility" Value="Collapsed"/>
<Setter Property="Width" Value="0"/>
</Style>
</Setter.Value>
</Setter>
<Setter Property="Background" Value="DynamicResource x:Static SystemColors.WindowBrushKey"/>
<Setter Property="SnapsToDevicePixels" Value="true"/>
<Setter Property="Validation.ErrorTemplate" Value="x:Null"/>
<Setter Property="ValidationErrorTemplate">
<Setter.Value>
<ControlTemplate>
<TextBlock Foreground="Red" Margin="2,0,0,0" Text="!" VerticalAlignment="Center"/>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type DataGridRow">
<Border x:Name="DGR_Border" BorderThickness="1" CornerRadius="5" Background="TemplateBinding Background" SnapsToDevicePixels="True">
<SelectiveScrollingGrid>
<SelectiveScrollingGrid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</SelectiveScrollingGrid.ColumnDefinitions>
<Grid Grid.Column="1">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<DataGridCellsPresenter ItemsPanel="TemplateBinding ItemsPanel" SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels"/>
<DataGridDetailsPresenter Margin="4" Grid.Row="1" SelectiveScrollingGrid.SelectiveScrollingOrientation="Binding AreRowDetailsFrozen, ConverterParameter=x:Static SelectiveScrollingOrientation.Vertical, Converter=x:Static DataGrid.RowDetailsScrollingConverter, RelativeSource=RelativeSource AncestorType=x:Type DataGrid" Visibility="TemplateBinding DetailsVisibility"/>
<Border BorderBrush="TemplateBinding BorderBrush" BorderThickness="TemplateBinding BorderThickness" Grid.RowSpan="2"/>
</Grid>
<DataGridRowHeader SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical" Visibility="Binding HeadersVisibility, ConverterParameter=x:Static DataGridHeadersVisibility.Row, Converter=x:Static DataGrid.HeadersVisibilityConverter, RelativeSource=RelativeSource AncestorType=x:Type DataGrid"/>
</SelectiveScrollingGrid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="DGR_Border" Property="BorderBrush" Value="Blue"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="DetailsVisibility" Value="Visible">
<Setter Property="BorderThickness" Value="4,1,4,4"/>
<Setter Property="BorderBrush" Value="#FF3886B9"/>
</Trigger>
<!--<Trigger Property="IsSelected" Value="True">
<Setter Property="BorderBrush" Value="Blue"/>
</Trigger>-->
</Style.Triggers>
</Style>
</DataGrid.Resources>
【讨论】:
我试过这个解决方案。有用。但随后又引入了另一个问题。我连续有一个超链接单元格。如果我将此设置器应用于 IsSelected = true。然后我需要点击两次超链接。有什么办法可以避免这种情况?【参考方案2】:我喜欢这个:
<Style TargetType="x:Type DataGridRow">
<Setter Property="BorderBrush" Value="LightGray" />
<Setter Property="BorderThickness" Value="1" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="BorderBrush" Value="Blue" />
</Trigger>
</Style.Triggers>
<Style.Resources>
<SolidColorBrush x:Key="x:Static SystemColors.HighlightBrushKey" Color="Transparent" />
<SolidColorBrush x:Key="x:Static SystemColors.HighlightTextBrushKey" Color="Black" />
</Style.Resources>
</Style>
【讨论】:
【参考方案3】:在DataGrid
上使用CellStyle
和RowStyle
。 DataGridCell
和 DataGridRow
都有 IsSelected
属性,可以在 Trigger
中使用来确定它们是否被选中。
以下内容应该可以解决问题:
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Style.Triggers>
<Trigger Property="IsSelected"
Value="True">
<Setter Property="Background"
Value="White" />
<Setter Property="Foreground"
Value="Black" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<Trigger Property="IsSelected"
Value="True">
<Setter Property="BorderBrush"
Value="Blue" />
<Setter Property="BorderThickness"
Value="2" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
随便玩玩,直到你做对为止。
【讨论】:
Border is rendering just how I wanted, but I can't do anything with background/foreground colors, when selecting a row It is filling with a solid blue 我不明白。你是想说Background
和Foreground
颜色不适用吗?您可以发布您使用的代码吗?您使用的是哪个版本的 WPF?
我似乎遇到了与非法移民相同的问题;似乎无法覆盖默认的蓝色行背景颜色,只能覆盖边框颜色。
我使用 *, 2* 等设置列宽,使列完全填满网格的宽度。如果我在 RowStyle 中设置 BorderThickness=2,这会导致数据网格有一个水平滚动条。作为替代方案,我将 BorderThickness 设置为“0,1,0,1”,以便它只在行的上方和下方显示一个边框。以上是关于WPF的DataGrid中如何获取当前被选定的行的第一个单元格的值?的主要内容,如果未能解决你的问题,请参考以下文章