WPFDataGrid控件使用
需要注意的是,datagrid控件有一个属性是AutoGenerateColumns,这个属性默认是ture,也就意味着,如果你为datagrid绑定数据时,不指定具体的数据表项
WPF会自动根据你所绑定的变量名称设置表项,但是为了可定制性,我们一般情况下都会将其设置为false,今天由于没有注意到这个问题,显示时名字又恰好跟变量名字
设置为一样了,结果悲剧的显示了重复的列,纠结了大半天,才发现是这个问题导致的。╮(╯Д╰)╭
xaml文件中的内容如下所示,
1 <Window x:Class="InputAndUpdate.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 2 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 3 xmlns:Collections="clr-namespace:System.Collections;assembly=mscorlib" 4 xmlns:System="clr-namespace:System;assembly=mscorlib" 5 xmlns:DataProvider="clr-namespace:InputAndUpdate.DataProvider" 6 Title="MainWindow" Height="350" Width="525" 7 Loaded="Window_Loaded_1"> 8 <!--在这里需要注意的是,我们在将转换器引入时,有可能会一直报,在命名空间内没有GenderConverter的情况,这时我们需要做的就是 9 将整个工程清理,并重新生成,执行这一步可以解决很多的这类问题 10 --> 11 <Window.Resources> 12 <DataProvider:GenderConverter x:Key="converter"></DataProvider:GenderConverter> 13 </Window.Resources> 14 <Grid> 15 <TextBox Name="myBox" Width="200" Margin="148,27,169,262" /> 16 <!--这里如果我们要显示的数据很多,则可以采用列冻结,也就是说无论我们怎么移动,我们要冻结的列总是显示在它初始化时所在的列,另外在datagrid中 17 表头之间是可以相互调换位置的,如果采用冻结表格也就意味着,不能调换位置了--> 18 <DataGrid Width="500" Margin="8,82,9,35" AutoGenerateColumns="False" Name="personInfoDG" FrozenColumnCount="1"> 19 <!--设置鼠标悬浮所在行的颜色--> 20 <DataGrid.RowStyle> 21 <Style TargetType="DataGridRow"> 22 <Style.Triggers> 23 <Trigger Property="IsMouseOver" Value="True"> 24 <Setter Property="Background" Value="Blue"/> 25 </Trigger> 26 </Style.Triggers> 27 </Style> 28 </DataGrid.RowStyle> 29 <!--设置显示信息,当单击某一行时,会在行的下面出现你所定义的显示形式和显示内容--> 30 <DataGrid.RowDetailsTemplate> 31 <DataTemplate> 32 <Border Margin="10" Padding="10" BorderBrush="SteelBlue" BorderThickness="3" CornerRadius="5"> 33 <TextBlock Text="{Binding Phonenumber}" FontSize="10"></TextBlock> 34 </Border> 35 </DataTemplate> 36 </DataGrid.RowDetailsTemplate> 37 <DataGrid.Columns> 38 <DataGridTextColumn Header="联系人姓名" Binding="{Binding Name}" IsReadOnly="True"> 39 <DataGridTextColumn.HeaderStyle> 40 <Style TargetType="DataGridColumnHeader"> 41 <Setter Property="FontWeight" Value="Bold"></Setter> 42 <Setter Property="Foreground" Value="Red"></Setter> 43 </Style> 44 </DataGridTextColumn.HeaderStyle> 45 </DataGridTextColumn> 46 <!--绑定数据的时候,如果需要在绑定数据的同时,绑定转换器,只需添加一个逗号即可。--> 47 <DataGridTextColumn Header="性别" Binding="{Binding Sex,Converter={StaticResource converter}}" IsReadOnly="True"></DataGridTextColumn> 48 <DataGridTextColumn Header="手机号码" Binding="{Binding Phonenumber}" 49 IsReadOnly="True"></DataGridTextColumn> 50 <!--测试使用comboxcolumn--> 51 <DataGridComboBoxColumn Header="性别" SelectedItemBinding="{Binding Sex}"> 52 <DataGridComboBoxColumn.ItemsSource> 53 <Collections:ArrayList> 54 <System:String>男</System:String> 55 <System:String>女</System:String> 56 </Collections:ArrayList> 57 </DataGridComboBoxColumn.ItemsSource> 58 </DataGridComboBoxColumn> 59 </DataGrid.Columns> 60 </DataGrid> 61 </Grid> 62 </Window>
主窗体后台代码
1 using System.Collections.Generic; 2 using System.Windows; 3 using System.Windows.Controls; 4 using InputAndUpdate.DataProvider; 5 6 namespace InputAndUpdate 7 { 8 /// <summary> 9 /// MainWindow.xaml 的交互逻辑 10 /// </summary> 11 public partial class MainWindow : Window 12 { 13 public MainWindow() 14 { 15 InitializeComponent(); 16 this.myBox.TextChanged += myBox_TextChanged; 17 this.personInfoDG.MouseDoubleClick += personInfoDG_MouseDoubleClick; 18 } 19 20 void personInfoDG_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) 21 { 22 //datagrid鼠标监听获得的是你所绑定的整个对象 23 DataGrid datagrid = sender as DataGrid; 24 Person person = (sender as DataGrid).SelectedItem as Person; 25 } 26 27 28 /* 29 * textbox监听事件,当textbox内容发生改变时触发如下事件,进行 30 * datagrid数据的更新 31 */ 32 void myBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e) 33 { 34 35 string phoneNumber = (sender as TextBox).Text; 36 string queryStatement = "select * from personinfo where phonenumber like \"%" + phoneNumber + "%\""; 37 List<Person> personlist = DataProvider.DataProvider.query(queryStatement); 38 personInfoDG.ItemsSource = personlist; 39 } 40 /* 41 * 主窗体加载时,初始化datagrid 42 */ 43 private void Window_Loaded_1(object sender, RoutedEventArgs e) 44 { 45 string queryStatement = "select * from personinfo"; 46 List<Person> personlist = DataProvider.DataProvider.query(queryStatement); 47 personInfoDG.ItemsSource = personlist; 48 } 49 } 50 }
转换器源码
1 using System; 2 using System.ComponentModel; 3 4 namespace InputAndUpdate.DataProvider 5 { 6 public class Person : INotifyPropertyChanged 7 { 8 private string name { set; get; } 9 private string sex { set; get; } 10 private string phonenumber { set; get; } 11 12 public string Name 13 { 14 set 15 { 16 name = value; 17 NotifyPropertyChanged("Name"); 18 } 19 get { return name; } 20 } 21 22 public string Sex 23 { 24 set 25 { 26 sex = value; 27 NotifyPropertyChanged("Sex"); 28 } 29 get { return sex; } 30 } 31 32 public string Phonenumber 33 { 34 set 35 { 36 phonenumber = value; 37 NotifyPropertyChanged("Phonenumber"); 38 } 39 get { return phonenumber; } 40 } 41 42 #region INotifyPropertyChanged Members 43 44 public event PropertyChangedEventHandler PropertyChanged; 45 46 #endregion 47 48 private void NotifyPropertyChanged(String propertyName) 49 { 50 if (PropertyChanged != null) 51 { 52 PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 53 } 54 } 55 } 56 }