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. 【转】Win7 64bit Oracle 11g 使用PL/SQL Developer 连接时提示“SQL*Net not properly installed”

    转载:http://www.cnblogs.com/xihuaodc/p/3189257.html  因为之前的Oracle不能用了,所以重新安装了64位的Oracle,安装一路正常 完了之后安装了P ...

  2. AspJpeg使用 .

    下载ASPJpeg的bll库,引用 一.为图片添加水印//实例化组件ASPJPEGLib.IASPJpeg objJpeg = new ASPJPEGLib.ASPJpeg();//打开源图片文件ob ...

  3. mount: unknown filesystem type 'ntfs'

    mount: unknown filesystem type 'ntfs' 问题描述 # mount –t ntfs /dev/sdc1 /mnt/usb2 mount: unknown filesy ...

  4. 关于delphi点击webbrowser中任意一点的问题

    关于delphi点击webbrowser中任意一点的问题 有时候我们需要delphi载入webbrowser1打开网页的时候 需要点击某一个点的位置 可能是坐标 可能是按钮 可能是其他的控件应该如何来 ...

  5. Oracle数据库迁移到AWS云的方案

    当前云已经成为常态,越来越多的企业希望使用云来增加基础设施的弹性.减轻基础设施的维护压力,运维的成本等.很多企业使用云碰到的难题之一是如何将现有的应用迁移到云上,将现有应用的中间件系统.Web系统及其 ...

  6. Dreamweaver扩展注意事项

    对Dreamweaver扩展做了一些整理. 扩展开发扩展(Extension),是应用程序给用户预留的二次开发接口.Dreamweaver提供了对菜单,插入栏(Insertbar),浮动框等GUI部件 ...

  7. shell学习--grep1

    一. grep的来源 通过ex编辑器来查找某个字串: :/pattern/p 其中p是打印,包含字符串pattern的第一行将被打印:如果需要打印包含pattern的所有行,可以这样: :/g/pat ...

  8. MVC的增删改和Razor

    ASP.NET MVC中的增删改查 基本都要使用C控制器中的两个action来完成操作,一个用于从主界面跳转到新页面.同时将所需操作的数据传到新界面,另一个则对应新界面的按钮,用于完成操作.将数据传回 ...

  9. Eclipse问题集锦

    1.SDK版本过低的问题. 现象: 更新SDK后,每次进入Eclipse,都会提示说需要23.0.0版本的SDK,当前的22.6.0版本的SDK版本过低:然而,确认更新后,结果却是说没有任何更新的东东 ...

  10. 图片轮播 js代码

    <script type="text/javascript"> //图片轮换 $(function () { //------------------ var sWid ...