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. webstorm11怎么设置成sublime3的界面

    引入架包导入即可 下载路径:https://github.com/OtaK/jetbrains-monokai-sublime

  2. Windows XP SP3 VC6环境下成功编译openssl-0.9.8zh

    1.下载openssl-0.9.8zh解压到f:\openssl-0.9.8zh 下载nasm-2.12.03rc1解压到D:\develop\nasm-2.12.03rc1并把添加到系统环境变量PA ...

  3. solr安装笔记与定时器任务

    一:solr启动 目前solr最高版本为5.5.0版本,很多solr安装都是说将server文件copy到tomcat中,但是solr版本自带有jetty的启动方式 首先下载solr-5.5.0版本, ...

  4. X64操作系统组件Jmail无法正常服务问题

    故障现象: 近日,在VMware虚拟化部署迁移中,之前物理服务器中部署网站ASP组件Jmail服务一切正常,迁移完成后发现Jmail无法正常工作,其余组件能正常工作. 环境:Windows Serve ...

  5. 20151207Study

    Liberal lawmakers proposed a bill to reduce the cost of medicine for older Americans.自由主义立法者提出一条减少老年 ...

  6. rdlc报表DEMO

    rdlc报表demo  .net 4.0  vs2013 文本框,图像控件,checkbox样式的打印 下载链接

  7. 海量数据相似度计算之simhash短文本查找

    在前一篇文章 <海量数据相似度计算之simhash和海明距离> 介绍了simhash的原理,大家应该感觉到了算法的魅力.但是随着业务的增长 simhash的数据也会暴增,如果一天100w, ...

  8. SQL Server Bulk Insert批量数据导入

    SQL Server的Bulk Insert语句可以将本地或远程的数据文件批量导入到数据库中,速度非常的快.远程文件必须共享才行,文件路径须使用通用约定(UNC)名称,即"\\服务器名或IP ...

  9. Google高级搜索语法

    Google高级搜索语法   Google搜索果真是一个强悍的不得了的搜索引擎,今天转了一些 google的高级搜索语法 希望能帮助到大家. 一.allinanchor: anchor是一处说明性的文 ...

  10. C# 基础(8)--网络编程

    套接字,客户端连接服务器,作为进程通讯机制,是基于描述IP地址和端口,是一个通讯链的句柄,其实质就是两个程序通讯用的. 非常类似于电话插座.双方通话的过程,是一方向电话机发出信号和对方从电话机接受信号 ...