相关文章推荐
儒雅的皮带  ·  [C#] ...·  1 年前    · 
public ref class DataGrid : System::Windows::Controls::Primitives::MultiSelector
public class DataGrid : System.Windows.Controls.Primitives.MultiSelector
type DataGrid = class
    inherit MultiSelector
Public Class DataGrid
Inherits MultiSelector
Object
DataGrid

以下示例演示如何将 绑定到 DataGrid 并使用 DataTable 列自动生成。 DataTable 通过使用 Fill 中的 DataSet DataAdapter 方法填充 。 有关详细信息,请参阅 创建数据集 从 DataAdapter 填充数据集 。 若要使用适用于 Visual Studio 的 WPF 设计器,请参阅 将 WPF 控件绑定到 Visual Studio 中的数据

<DataGrid x:Name="CustomerGrid" ItemsSource="{Binding}" AlternatingRowBackground="LightBlue" AlternationCount="2" /> //Set the DataGrid's DataContext to be a filled DataTable CustomerGrid.DataContext = custDataTable; 'Set the DataGrid's DataContext to be a filled DataTable CustomerGrid.DataContext = custDataTable

以下示例演示如何使用自定义 Columns 集合创建 DataGrid

<NavigationWindow x:Class="DataGrid_CustomColumns.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:core="clr-namespace:System;assembly=mscorlib" xmlns:local="clr-namespace:DataGrid_CustomColumns" Title="Customers" Height="300" Width="300" ShowsNavigationUI="False" > <NavigationWindow.Resources> <!--Create list of enumeration values--> <ObjectDataProvider x:Key="myEnum" MethodName="GetValues" ObjectType="{x:Type core:Enum}"> <ObjectDataProvider.MethodParameters> <x:Type Type="local:OrderStatus"/> </ObjectDataProvider.MethodParameters> </ObjectDataProvider> <!--Create an instance of the converter for Email--> <local:EmailConverter x:Key="EmailConverter" /> </NavigationWindow.Resources> <NavigationWindow.Content> <DataGrid Name="DG1" ItemsSource="{Binding}" AutoGenerateColumns="False" > <DataGrid.Columns> <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}"/> <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}" /> <!--The Email property contains a URI. For example "mailto:lucy0@adventure-works.com"--> <DataGridHyperlinkColumn Header="Email" Binding="{Binding Email}" ContentBinding="{Binding Email, Converter={StaticResource EmailConverter}}" /> <DataGridCheckBoxColumn Header="Member?" Binding="{Binding IsMember}" /> <DataGridComboBoxColumn Header="Order Status" SelectedItemBinding="{Binding Status}" ItemsSource="{Binding Source={StaticResource myEnum}}" /> </DataGrid.Columns> </DataGrid> </Grid> </NavigationWindow.Content> </NavigationWindow> //Additional using statements using System.Data; using System.Windows.Data; using System.Windows.Navigation; 'Additional using statements Imports System.Data Imports System.Collections.ObjectModel Imports System.Diagnostics public partial class Window1 : NavigationWindow Class Window1 public Window1() InitializeComponent(); //GetData() creates a collection of Customer data from a database ObservableCollection<Customer> custdata = GetData(); //Bind the DataGrid to the customer data DG1.DataContext = custdata; Public Sub New() ' This call is required by the Windows Form Designer. InitializeComponent() ' Add any initialization after the InitializeComponent() call. 'GetData() creates a collection of Customer data from a database Dim custdata As ObservableCollection(Of Customer) = GetData() 'Bind the DataGrid to the customer data DG1.DataContext = custdata End Sub //Defines the customer object public class Customer public string FirstName { get; set; } public string LastName { get; set; } public Uri Email { get; set; } public bool IsMember { get; set; } public OrderStatus Status { get; set; } 'Defines the customer object Public Class Customer Public Property FirstName() As String Public Property LastName() As String Public Property Email() As Uri Public Property IsMember() As Boolean Public Property Status() As OrderStatus End Class End Class public enum OrderStatus { None, New, Processing, Shipped, Received }; Public Enum OrderStatus [New] Processing Shipped Received End Enum //Converts the mailto uri to a string with just the customer alias public class EmailConverter : IValueConverter public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) if (value != null) string email = value.ToString(); int index = email.IndexOf("@"); string alias = email.Substring(7, index-7); return alias; string email = ""; return email; public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) Uri email = new Uri((string)value); return email; 'Converts the mailto uri to a string with just the customer alias Public Class EmailConverter Implements IValueConverter Public Function Convert(value As Object, targetType As System.Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert If value IsNot Nothing Then Dim email As String = value.ToString() Dim index As Integer = email.IndexOf("@") Dim [alias] As String = email.Substring(7, index - 7) Return [alias] Dim email As String = "" Return email End If End Function Public Function ConvertBack(value As Object, targetType As System.Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack Dim email As New Uri(DirectCast(value, String)) Return email End Function End Class

控件 DataGrid 提供了一种灵活的方法,用于在行和列中显示数据集合。 DataGrid 包括用于托管自定义内容的内置列类型和模板列。 内置行类型包括一个下拉详细信息部分,可用于在单元格值下方显示其他内容。

绑定到数据

若要将 DataGrid 绑定到数据,请将 ItemsSource 属性设置为 IEnumerable 实现。 数据网格中的每一行都绑定到数据源中的一个对象,数据网格中的每一列都绑定到数据对象的属性。 为了使用户界面在 DataGrid 源数据中添加或删除项时自动更新, DataGrid 必须将 绑定到实现 接口的 INotifyCollectionChanged 集合,例如 ObservableCollection<T> 。 若要自动反映属性更改,源集合中的对象必须实现 INotifyPropertyChanged 接口。 有关详细信息,请参阅 wpf) (数据绑定

默认情况下,控件会在 DataGrid 你设置 ItemsSource 属性时自动生成列。 生成的列的类型取决于列中的数据类型。 下表列出了生成的列类型。

生成的列类型

下图显示了每个列类型。

自动生成列时,可以处理 事件以 AutoGeneratingColumn 在将列添加到 DataGrid 之前自定义或取消列。 如果将用户定义的列和自动生成的列同时添加到 , DataGrid 则首先添加用户定义的列。 若要重新排列列的显示顺序,可以设置 DisplayIndex 单个列的 属性。

可以通过将 属性设置为 AutoGenerateColumns false 来阻止自动列生成。 如果要显式创建和配置所有列,这非常有用。

DataGridTemplateColumn 如果内置列类型不能满足你的需求,请使用 类型来定义自定义列。 类型 DataGridTemplateColumn 提供 CellTemplate CellEditingTemplate 属性,使你可以为显示模式和编辑模式指定内容模板。 例如,可以为日期定义自定义列。 可以 CellTemplate 定义 TextBlock 以显示日期,而 CellEditingTemplate 可以定义用于 DatePicker 编辑日期的控件。

可以使用 Columns 集合在运行时以编程方式添加、插入、删除和更改控件中的任何列。 IsAutoGenerated 检查 属性以确定列是自动生成的还是用户定义的。 更改时,将自动添加、删除或重新生成自动生成的 ItemsSource 列。

默认情况下,当用户单击 中的 DataGrid 单元格时,将选择整行,用户可以选择多行。 可以设置 属性以 SelectionUnit 指定用户是否可以选择单元格和/或整行。 SelectionMode 设置 属性以指定是可以选择多个行或单元格,还是只能选择单个行或单元格。

可以获取有关从 SelectedCells 属性中选择的单元格的信息。 可以获取有关在 事件的 中 SelectedCellsChangedEventArgs SelectedCellsChanged 更改了其选择的单元格的信息。 SelectAllCells 调用 或 UnselectAllCells 方法以编程方式选择或取消选择所有单元格。 有关详细信息,请参阅 DataGrid 控件中的默认键盘和鼠标行为

分组、排序和筛选

默认情况下,可以通过单击列标题对 中的 DataGrid 项进行排序。 可以通过处理 事件来 Sorting 自定义排序。 若要取消默认排序,请将 Handled 属性设置为 true 。 还可以先对源数据进行排序,然后再将其显示在 中 DataGrid

若要对 中的数据 DataGrid 进行分组、排序和筛选,请将 绑定到 DataGrid 支持这些操作的 ICollectionView 实现。 然后,对集合视图执行操作。 在 DataGrid 中对项进行分组后,可以定义一个 GroupStyle 来指定每个组的外观。 通过将 它添加到 的 集合来 GroupStyle DataGrid 应用 GroupStyle 。 如果你有多个级别的分组,则可以对每个级别的组应用不同的样式。 样式按照定义顺序应用。 有关详细信息,请参阅 如何:在 DataGrid 控件中对数据进行分组、排序和筛选

默认情况下,可以直接在 中 DataGrid 编辑项。 若要保证可以正确提交和取消编辑,中的 DataGrid 对象必须实现 IEditableObject 接口。 或者,可以将 属性设置为 IsReadOnly true 以在 中 DataGrid 禁用编辑。

DataGrid 具有对以下编辑命令的内置支持:

Command 默认输入绑定

通过单击或按 F2 将当前单元格置于编辑模式。 移动到同一行中的另一个单元格时,或在单元格处于编辑模式时按 Enter,将提交单元格级编辑。 当移动到另一行或在行处于编辑模式时按 Enter 时,将提交行中的所有编辑。 按 ESC 一次可取消单元格编辑,按 ESC 两次可取消行中的所有编辑。 有关以编程方式提交和取消编辑的详细信息,请参阅 BeginEdit CommitEdit CancelEdit 方法。 有关编辑相关事件的详细信息,请参阅 BeginningEdit PreparingCellForEdit CellEditEnding RowEditEnding

CanUserAddRows 设置 和 CanUserDeleteRows 属性以指定用户是否可以添加或删除行。 用户可以通过按 DELETE 键删除所选行。 如果 属性 CanUserAddRows 设置为 true ,则会添加新项行作为 中的 DataGrid 最后一行。 可以通过处理 事件来设置新项的 InitializingNewItem 默认值。

是否允许编辑操作受各种其他因素(包括 IsReadOnly IsEnabled 状态 DataGrid )以及基础数据收集是否允许该操作的影响。

DataGrid 使你能够在单元格和行级别执行验证。 通过单元格级别验证,可以在用户更新值时验证绑定数据对象的单个属性。 通过行级别验证,可以在用户提交对行的更改时验证整个数据对象。 可以通过设置 RowValidationErrorTemplate 属性为行级验证错误提供自定义视觉反馈,也可以使用默认错误指示器。 若要创建自定义验证规则,请创建派生自 类的 ValidationRule 类并实现 Validate 方法。 将自定义验证规则添加到集合。 RowValidationRules

自定义 DataGrid 控件

控件 DataGrid 支持常见的表格格式设置选项,例如交替行背景,以及显示或隐藏标题、网格线和滚动条的功能。 此外,控件提供了多个样式和模板属性,可用于完全更改控件及其行、列、标题和单元格的外观。

若要自定义 DataGrid 行为,可以处理选择更改、单元格编辑和列重新排序的事件。 还 DataGrid 公开了多个行回收事件,你可以处理这些事件来自定义行。

若要将相同的属性设置应用于多个 DataGrid 控件,请使用 Style 属性。 可以修改默认 ControlTemplate 以赋予控件独特的外观。 有关创建 的详细信息, ControlTemplate 请参阅 通过创建 ControlTemplate 自定义现有控件的外观 。 若要查看特定于 DataGrid 的部分和状态,请参阅 DataGrid 样式和模板

此控件的依赖属性可能由控件的默认样式设置。 如果属性由默认样式设置,则当控件出现在应用程序中时,该属性可能会从其默认值更改。 默认样式由应用程序运行时使用的桌面主题决定。

只有视觉对象属性已存在于控件的默认模板中并且已使用 TemplateBinding 设置时,设置该属性才有效。 在 通过创建 ControlTemplate 自定义现有控件的外观 一文的 更改控件的视觉结构 部分可以找到视觉属性列表。

下表提供了有关通常与 DataGrid 关联的任务的信息。

设置交替行背景色 将 AlternationIndex 属性设置为 2 或更多,然后将 Brush 分配给 RowBackground AlternatingRowBackground 属性。 定义单元格和行选择行为 设置 SelectionMode SelectionUnit 属性。 自定义标题、单元格和行的视觉外观 将新的 Style 应用于 ColumnHeaderStyle RowHeaderStyle CellStyle RowStyle 属性。 设置调整大小选项 设置 Height MaxHeight MinHeight Width MaxWidth MinWidth 属性。 有关详细信息,请参阅 DataGrid 控件中的调整大小选项 。 访问所选项 检查 属性 SelectedCells 以获取所选单元格,并检查 SelectedItems 属性以获取所选行。 有关更多信息,请参见 SelectedCells 属性。 自定义最终用户交互 设置 CanUserAddRows CanUserDeleteRows CanUserReorderColumns CanUserResizeColumns CanUserResizeRows CanUserSortColumns 属性。 取消或更改自动生成的列 处理 AutoGeneratingColumn 事件。 将 FrozenColumnCount 属性设置为 1,并通过将 DisplayIndex 属性设置为 0 将列移动到最左边的位置。 使用 XML 数据作为数据源 将 ItemsSource 上的 DataGrid 绑定到表示项集合的 XPath 查询。 在 DataGrid 中创建每一列。 通过将绑定上的 XPath 设置为获取项源属性的查询来绑定每一列。 有关示例,请参见 DataGridTextColumn 。 绑定到 CollectionView 支持分组的 或 CollectionViewSource 。 有关详细信息,请参阅 如何:在 DataGrid 控件中对数据进行分组、排序和筛选 。 显示行的详细信息部分 定义 以 RowDetailsTemplate 指定详细信息部分的外观。 设置 以 RowDetailsVisibilityMode 指定何时显示详细信息部分。 有关详细信息,请参阅 如何:向 DataGrid 控件添加行详细信息

为指定的路由事件添加路由事件处理程序,并将该处理程序添加到当前元素的处理程序集合中。 将 handledEventsToo 指定为 true ,可为已标记为由事件路由中的其他元素处理的路由事件调用所提供的处理程序。

(继承自 UIElement )

定位子元素,并确定 UIElement 的大小。 父元素从它们的 ArrangeCore(Rect) 实现(或者是 WPF 框架级别等效项)调用此方法,以便形成递归布局更新。 此方法产生第二次布局更新。

(继承自 UIElement )

对指定依赖属性的值进行强制。 通过对调用方 DependencyObject 上存在的依赖属性的属性元数据中所指定的任何 CoerceValueCallback 函数进行调用来完成此操作。

(继承自 DependencyObject )

更新 UIElement DesiredSize 。 父元素从其自身的 MeasureCore(Size) 实现调用此方法以形成递归布局更新。 调用此方法构成布局更新的第一个处理过程(“测量”处理过程)。

(继承自 UIElement )

每当更新此 FrameworkElement 的任何依赖属性的有效值时调用。 将在自变量参数中报告已更改的特定依赖属性。 重写 OnPropertyChanged(DependencyPropertyChangedEventArgs)

(继承自 FrameworkElement )

支持 FrameworkElement 的专用子类中的增量布局实现。 如果子元素包含无效属性,且该属性在元数据中标记为影响布局过程中父元素的测量或排列过程的因素,则调用 ParentLayoutInvalidated(UIElement)

(继承自 FrameworkElement )