zoukankan      html  css  js  c++  java
  • wpf下datagrid使用过程中需要注意的几点(一)

    MainWindow.xaml中的代码如下:

    <DataGrid  CanUserAddRows="False"  ItemsSource="{Binding}" AutoGenerateColumns="false" Height="248" HorizontalAlignment="Left" Margin="12,11,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="184" ColumnHeaderHeight="30"  FontSize="14"   MinRowHeight="20" RowBackground="#FFEFF4FF" RowHeight="20"  >
                <DataGrid.Columns>
                    <DataGridTextColumn Header="用户名" Width="100" Binding="{Binding userName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                    <DataGridTextColumn Header="密码" Width="80" Binding="{Binding passWord, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
    
                    <!--这个Mode=TwoWay必须要有,否则你绑定的数据源不能随着你的更改去更新-->
                </DataGrid.Columns>
                
              <DataGrid.RowStyle>  
                <Style TargetType="DataGridRow">  
                   <Setter Property="Background" Value="LightBlue" />  
                   <Style.Triggers>  
                       <Trigger Property="IsMouseOver" Value="True">     <!--当鼠标经过时 改变颜色-->  
                            <Setter Property="Background" Value="SkyBlue"/>  
                             <Setter Property="Foreground" Value="White"/>  
                       </Trigger>  
                 </Style.Triggers>  
                </Style>  
              </DataGrid.RowStyle>
    
                <DataGrid.CellStyle>
                    <Style TargetType="DataGridCell">
                        <Style.Triggers>
                            <Trigger Property="IsSelected" Value="True">
                                <!--单元格被选中时 改变颜色-->
                                <Setter Property="Background" Value="LightPink"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </DataGrid.CellStyle>
    
                <!--行表头样式-->
    
              <DataGrid.RowHeaderStyle>
                    <Style TargetType="DataGridRowHeader">
                        <Setter Property="Content" Value="*"/>
                        <Setter Property="Width" Value="15"/>
                        <Setter Property="Background">
                            <Setter.Value>
                                <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                                    <GradientStop Color="White" Offset="0"/>
                                    <!--这里用到了两种颜色  也可以多层  这样就可以产生一种渐变的效果或立体感-->
                                    <GradientStop Color="SkyBlue" Offset="1"/>
                                </LinearGradientBrush>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </DataGrid.RowHeaderStyle>
    
        <--列表头样式-->
    
                <DataGrid.ColumnHeaderStyle>
                    <Style TargetType="DataGridColumnHeader">
                        <Setter Property="Background">
                            <Setter.Value>
                                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                                    <GradientStop Color="White" Offset="0"/>
                                    <GradientStop Color="LightBlue" Offset="0.5"/>
                                    <GradientStop Color="White" Offset="1"/>
                                </LinearGradientBrush>
                            </Setter.Value>
                        </Setter>
                        <Setter Property="Foreground" Value="Black"/>
                        <Setter Property="FontSize" Value="13" />
                    </Style>
                </DataGrid.ColumnHeaderStyle>
            </DataGrid>
            <Button Content="添加" Height="29" HorizontalAlignment="Left" Margin="12,266,0,0" Name="btn_add" VerticalAlignment="Top" Width="57" Click="btn_add_Click" />
            <Button Content="保存" Height="29" HorizontalAlignment="Left" Margin="139,266,0,0" Name="btn_save" VerticalAlignment="Top" Width="57" Click="btn_save_Click" />
            <Button Content="删除" Height="29" HorizontalAlignment="Left" Margin="75,266,0,0" Name="btn_del" VerticalAlignment="Top" Width="57" Click="btn_del_Click" />
    
     

    在public mainWindow()中写入一下代码,对datagrid数据源进行绑定

         dataGrid1.DataContext = minfo;

        其中minfo是以下类的一个实例,每次将存储的序列化文件,反序列化后装入到minfo实例。类代码如下:

         

    [Serializable]
        public class Member
        {
            public string userName { get; set; }
            public string passWord { get; set; }
    
        }

        注意上面的[Serializable]属性是序列化存储时用的。

    //添加新行按钮触发事件
            private void btn_add_Click(object sender, RoutedEventArgs e)
            {
                editFlag = true;
                dataGrid1.CanUserAddRows = true;
            }
            //保存datagrid数据的触发按钮事件
            private void btn_save_Click(object sender, RoutedEventArgs e)
            {
                datahandle dh = new datahandle();
                //foreach (Member info in minfo)
                //{
               //     dh.memberData.Add(info);  //执行插入方法,将记录保存到数据库  
              //  }
                //刚开始我用自己写的方法(上面注释掉部分)去更新源数据,才发现不设置Mode=TwoWay属性,一切都是徒劳
                //以下两句是我自定义的序列化类
                dh.memberData = minfo;
                dh.SerializeNow(minfo);
                editFlag = false;  //让编辑状态失效  
                
                dataGrid1.CanUserAddRows = false;     //因为完成了添加操作 所以设置DataGrid不能自动生成新行了  
                dataGrid1.ItemsSource = minfo;//重新绑定以下
            }
    
            private void btn_del_Click(object sender, RoutedEventArgs e)
            {
                int n=dataGrid1.SelectedIndex;//所选中的删除行的索引号
               
                int s = minfo.Count;
                if (n < 0 || minfo.Count == 0)
                {
                    return;
                }
                minfo.RemoveAt(n);
                dataGrid1.ItemsSource = minfo;
            }
            //我们通过 RowEditEnding来获取新增的记录,就是每次编辑完行后,行失去焦点激发该事件。更新记录也是执行该事件。
            private void dataGrid1_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
            {
               Member  info = new Member();    //我自己的数据表实例类  
                info = e.Row.Item as Member;   //获取该行的记录
                int n = e.Row.GetIndex();
                if (editFlag)                 
                //如果是添加状态就保存该行的值到lstInformation中  这样我们就完成了新行值的获取  
                {
                    updateMinfo(info, n);//如果是编辑状态就执行更新操作  更新操作最简单,因为你直接可以在DataGrid里面进行编辑,编辑完成后执行这个事件就完成更新操作了  
                    editFlag = false;
                }
          
            }
    
            private void updateMinfo(Member _info, int n)
            {
                n = n - 1;
                minfo[n].userName = _info.userName;
                minfo[n].passWord = _info.passWord;
            }

    通过以下航代码实现了datagrid的插入、删除和修改等动作。

    行号的添加可以通过以下代码去实现

    }
            //窗体加载事件  
    
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
               
                dataGrid1.LoadingRow += new EventHandler<DataGridRowEventArgs>(dataGrid_LoadingRow);    //自动添加序号的事件  调用下面的dataGrid_LoadingRow  
            }
    
            public void dataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
            {
                e.Row.Header = e.Row.GetIndex() + 1;    //设置行表头的内容值  
            }  

    不过好像每次都有点问题,不能把全部行号更新过来。至于问题到底在什么地方,我也没有搞清楚。

    下一篇我将会对序列化存储和反序列化进行梳理。

        

  • 相关阅读:
    软件开发沉思录读书笔记
    卓有成效的程序员读书笔记
    结对编程收获
    《提高c++性能的编程技术》读书笔记
    第六次读书笔记
    第五周读书笔记
    美团与它的超级大脑
    第四次读书笔记
    团队-团队编程项目爬取豆瓣电影top250-模块测试过程
    团队-爬取豆瓣电影TOP250-模块开发过程
  • 原文地址:https://www.cnblogs.com/zwbgreat/p/3429114.html
Copyright © 2011-2022 走看看