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;    //设置行表头的内容值  
            }  

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

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

        

  • 相关阅读:
    jvm基本结构和解析
    多态的意思
    java中对象的简单解读
    double类型和int类型的区别
    python 解析xml文件
    win10不能映射Ubuntu共享文件
    Qt程序打包
    Ubuntu boot分区文件误删,系统无法启动,怎么解
    ubuntu Boot空间不够问题“The volume boot has only 5.1MB disk space remaining”
    Ubuntu 分辨率更改 xrandr Failed to get size of gamma for output default
  • 原文地址:https://www.cnblogs.com/zwbgreat/p/3429114.html
Copyright © 2011-2022 走看看