需要注意的是,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 }