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 < || minfo.Count == )
{
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 - ;
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() + ; //设置行表头的内容值
}

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

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

wpf下datagrid使用过程中需要注意的几点(一)的更多相关文章

  1. 在Linux下安装PHP过程中,编译时出现错误的解决办法

    在Linux下安装PHP过程中,编译时出现configure: error: libjpeg.(a|so) not found 错误的解决办法 configure: error: libjpeg.(a ...

  2. iOS下KVO使用过程中的陷阱 (转发)

    iOS下KVO使用过程中的陷阱   KVO,全称为Key-Value Observing,是iOS中的一种设计模式,用于检测对象的某些属性的实时变化情况并作出响应.网上广为流传普及的一个例子是利用KV ...

  3. windows下创建子进程过程中代码重复执行问题

    windows在启动子进程的时候会将主进程文件倒入到子进程中.导入模块就相当于执行这个模块中的代码, 所以第一个print会在主进程中执行一次,又在被导入的过程中在子进程中又执行了一次. p.star ...

  4. WINDOWS系统下MYSQL安装过程中的注意事项

    1.首先MySQL的安装方式有两种:一种是MSI安装方式,很简单就像安装Windows软件一样.另外一种就是ZIP安装方式.这种相对而言比较麻烦.新手推荐MSI安装方式. 安装方式有以下两种: MSI ...

  5. 关于使用MVVM模式在WPF的DataGrid控件中实现ComboBox编辑列

    最近在做一个组态软件的项目,有一个需求需要在建立IO设备变量的时候选择变量的类型等. 建立IO变量的界面是一个DataGrid实现的,可以一行一行的新建变量,如下如所示: 这里需要使用带有ComboB ...

  6. 【原】iOS下KVO使用过程中的陷阱

    KVO,全称为Key-Value Observing,是iOS中的一种设计模式,用于检测对象的某些属性的实时变化情况并作出响应.网上广为流传普及的一个例子是利用KVO检测股票价格的变动,例如这里.这个 ...

  7. win10下安装Wampservice过程中遇到的问题及解决办法

    今天在电脑上装Wampserver的时候遇到了几个问题,启动Wampserver无法成功,一直显示橙色.若启动成功Wampserver的图标会显示绿色. 下面的是解决方法 安装 在浏览器中搜索Wamp ...

  8. 记录下安装ES过程中遇到的错误及解决

    1.集群配置 需要修改 cluster.name .node.name .network.host: 0.0.0.0[此处默认localhost].http.port: 9200 只要集群名相同,且机 ...

  9. win10下mysql安装过程中遇到的各种坑

    前几天重装系统,又要下回来mysql,但没想到还是遇到了许多麻烦,翻了十多篇博文才搞定,写个总结出来方便以后不要重复踩坑,也给大家参考参考. 1.下载与安装 这个没什么好说的,下载地址网上一大堆,安装 ...

随机推荐

  1. 对Linux(Unix)的基础知识归纳

    前言,不论是原生APP(Android&IOS),还是大型架构级基础环境(.NET&J2EE,或LAMP阵营等), 基本都不可避免的涉及到Linux(Unix),故还是觉得有必要把自己 ...

  2. tnsnames.ora配置注意(连接新的数据库)

    文件地址D:\app\think\product\11.2.0\instantclient_11_2\network\admin\tnsnames.ora# tnsnames.ora Network ...

  3. My安卓知识3--多个activity之前共享数据的方法

    在网上搜这个问题的时候看到了有一篇文章说有五种方法: 1.基于消息的通信机制  Intent ---boudle ,extra 数据类型有限,比如遇到不可序列化的数据Bitmap,InputStrea ...

  4. Python中获取异常(Exception)信息

    异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try...except...程序 ...

  5. 《笨办法学C》笔记之Makefile

    使用gcc编译C语言源码 在Linux系统中,C语言源码需要用gcc编译为二进制可执行文件,才能够运行. $ gcc test.c -o test 这句命令就将test.c文件编译为test二进制可执 ...

  6. 注册表信息(安装包ProductCode,设置启动运行)

    一.获取安装包ProductCode后,再获取安装包DisplayVersion,比对安装包版本,确定是否更新当前应用(重新下载安装包,并运行安装包) //获取当前应用程序的安装包的ProductCo ...

  7. ArrayList与LinkedList用法与区别

    1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.  2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedLis ...

  8. HTML5中判断横屏竖屏

    在移动端中我们经常碰到横屏竖屏的问题,那么我们应该如何去判断或者针对横屏.竖屏来写不同的代码呢. 这里有两种方法: 一:CSS判断横屏竖屏 写在同一个CSS中 1 2 3 4 5 6 @media s ...

  9. LoopbackJS 生成对应 Oracle 视图的model

    StrongLoop Arc 工具中的discover model 目前只能discover 表, Oracle数据库中的视图经测试并不能显示在列表中. 无奈之下,暂时只能采取替代方案. 解决方法: ...

  10. poj3728

    [描述] 有 N 城 市在一个国家,有一个且只有一个简单的路径每一对城市之间. 一个商人选择了一些路径和想赚尽可能多的钱在每个路径. 当他沿着一条路径,可以选择一个城市购买一些商品和出售他们在一个城市 ...