C# WPF入門學習主線篇(十)—— DataGrid常見屬性和事件
歡迎來到C# WPF入門學習系列的第十篇。在前面的文章中,我們已經學習了 Button
、TextBox
、Label
、ListBox
和 ComboBox
控件。今天,我們將探討 WPF 中的另一個重要控件——DataGrid
。本文將詳細介紹 DataGrid
的常見屬性和事件,并通過示例代碼展示其在實際應用中的使用。
一、DataGrid的基礎知識
DataGrid
是一個非常強大的控件,用于顯示和操作表格數據。它允許用戶以表格形式查看數據,并支持排序、分組、篩選、編輯等功能。
DataGrid的基本定義
我們先來看看一個簡單的 DataGrid
定義:
<Window x:Class="WpfApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MainWindow" Height="350" Width="525"><Grid><DataGrid x:Name="myDataGrid" AutoGenerateColumns="True" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="300"/></Grid>
</Window>
在這個示例中,我們定義了一個 DataGrid
控件,并設置了 AutoGenerateColumns
屬性為 True
,這意味著列將自動根據數據源生成。
二、DataGrid的常見屬性
1. ItemsSource
ItemsSource
屬性用于綁定 DataGrid
的數據源。可以是數組、列表或任何實現了 IEnumerable
接口的集合。
<DataGrid x:Name="myDataGrid" AutoGenerateColumns="True" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="300"/>
public partial class MainWindow : Window
{public MainWindow(){InitializeComponent();myDataGrid.ItemsSource = new List<Person>{new Person { Name = "John Doe", Age = 30 },new Person { Name = "Jane Smith", Age = 25 }};}
}public class Person
{public string Name { get; set; }public int Age { get; set; }
}
2. AutoGenerateColumns
AutoGenerateColumns
屬性決定是否自動生成列。設置為 False
時,需要手動定義列。
<DataGrid x:Name="myDataGrid" AutoGenerateColumns="False" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="300"><DataGrid.Columns><DataGridTextColumn Header="Name" Binding="{Binding Name}"/><DataGridTextColumn Header="Age" Binding="{Binding Age}"/></DataGrid.Columns>
</DataGrid>
3. ColumnHeaderHeight
ColumnHeaderHeight
屬性設置列標題的高度。
<DataGrid x:Name="myDataGrid" ColumnHeaderHeight="40" AutoGenerateColumns="True" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="300"/>
4. CanUserAddRows
CanUserAddRows
屬性設置用戶是否可以添加新行。
<DataGrid x:Name="myDataGrid" CanUserAddRows="False" AutoGenerateColumns="True" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="300"/>
5. CanUserDeleteRows
CanUserDeleteRows
屬性設置用戶是否可以刪除行。
<DataGrid x:Name="myDataGrid" CanUserDeleteRows="False" AutoGenerateColumns="True" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="300"/>
6. IsReadOnly
IsReadOnly
屬性設置 DataGrid
是否為只讀。
<DataGrid x:Name="myDataGrid" IsReadOnly="True" AutoGenerateColumns="True" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="300"/>
示例
下面是一個包含以上常見屬性的完整示例:
<Window x:Class="WpfApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MainWindow" Height="350" Width="525"><Grid><DataGrid x:Name="myDataGrid" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="True" IsReadOnly="False"ColumnHeaderHeight="40" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="300"><DataGrid.Columns><DataGridTextColumn Header="Name" Binding="{Binding Name}"/><DataGridTextColumn Header="Age" Binding="{Binding Age}"/></DataGrid.Columns></DataGrid></Grid>
</Window>
using System.Collections.Generic;
using System.Windows;namespace WpfApp
{public partial class MainWindow : Window{public MainWindow(){InitializeComponent();myDataGrid.ItemsSource = new List<Person>{new Person { Name = "John Doe", Age = 30 },new Person { Name = "Jane Smith", Age = 25 }};}}public class Person{public string Name { get; set; }public int Age { get; set; }}
}
三、DataGrid的常見事件
1. LoadingRow
LoadingRow
事件在行加載時觸發。
XAML代碼
<DataGrid x:Name="myDataGrid" AutoGenerateColumns="True" LoadingRow="MyDataGrid_LoadingRow" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="300"/>
后臺代碼
private void MyDataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
{e.Row.Header = (e.Row.GetIndex() + 1).ToString();
}
2. SelectionChanged
SelectionChanged
事件在選擇的項目發生更改時觸發。
XAML代碼
<DataGrid x:Name="myDataGrid" AutoGenerateColumns="True" SelectionChanged="MyDataGrid_SelectionChanged" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="300"/>
后臺代碼
private void MyDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{DataGrid dataGrid = sender as DataGrid;Person selectedPerson = dataGrid.SelectedItem as Person;if (selectedPerson != null){MessageBox.Show($"Selected Person: {selectedPerson.Name}, Age: {selectedPerson.Age}");}
}
3. CellEditEnding
CellEditEnding
事件在單元格編輯即將結束時觸發。
XAML代碼
<DataGrid x:Name="myDataGrid" AutoGenerateColumns="True" CellEditEnding="MyDataGrid_CellEditEnding" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="300"/>
后臺代碼
private void MyDataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{MessageBox.Show("Cell editing is ending.");
}
示例總結
以下是一個包含所有三種常見事件的完整示例:
<Window x:Class="WpfApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MainWindow" Height="350" Width="525"><!-- 定義一個 Grid 容器,用于布局子控件 --><Grid><!-- 定義一個 DataGrid 控件 --><DataGrid x:Name="myDataGrid"AutoGenerateColumns="True" <!-- 自動生成列 -->LoadingRow="MyDataGrid_LoadingRow" <!-- 行加載事件 -->SelectionChanged="MyDataGrid_SelectionChanged" <!-- 選擇更改事件 -->CellEditEnding="MyDataGrid_CellEditEnding" <!-- 單元格編輯結束事件 -->HorizontalAlignment="Left" VerticalAlignment="Top" <!-- 控件水平和垂直對齊 -->Width="500" Height="300"/> <!-- 控件寬度和高度 --></Grid>
</Window>
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;namespace WpfApp
{public partial class MainWindow : Window{public MainWindow(){InitializeComponent(); // 初始化組件// 初始化數據源并綁定到 DataGridmyDataGrid.ItemsSource = new List<Person>{new Person { Name = "John Doe", Age = 30 },new Person { Name = "Jane Smith", Age = 25 }};}// 行加載事件處理程序private void MyDataGrid_LoadingRow(object sender, DataGridRowEventArgs e){// 設置行頭為行索引加一(從1開始)e.Row.Header = (e.Row.GetIndex() + 1).ToString();}// 選擇更改事件處理程序private void MyDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e){// 獲取觸發事件的 DataGridDataGrid dataGrid = sender as DataGrid;// 獲取選中的項目并轉換為 Person 類型Person selectedPerson = dataGrid.SelectedItem as Person;if (selectedPerson != null) // 如果有選中的項目{// 顯示選中的人的名字和年齡MessageBox.Show($"Selected Person: {selectedPerson.Name}, Age: {selectedPerson.Age}");}}// 單元格編輯結束事件處理程序private void MyDataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e){// 顯示單元格編輯結束消息MessageBox.Show("Cell editing is ending.");}}// 定義一個簡單的 Person 類,用于數據綁定public class Person{public string Name { get; set; } // 名字屬性public int Age { get; set; } // 年齡屬性}
}
四、總結
本文詳細介紹了 WPF 中 DataGrid
控件的常見屬性和事件,通過具體的示例代碼展示了如何使用這些屬性和事件。通過本文的學習,讀者應該能夠掌握 DataGrid
的基本用法,并在實際項目中靈活運用這些知識。