您的位置:首页 > 数据库

WPF学习日志1---DataGrid绑定与修改更新(数据List & 数据库)[部分代码有摘录其他文章]

2016-01-03 15:51 796 查看
本内容分为三大块:

DataGrid数据绑定显示

内容修改—后台源数据

内容修改—数据库源数据​

DataGrid数据绑定显示

​ 其实数据显示也分为后台源数据与数据库源数据两部分,因为类似度较高所以合并一起写了。

先看后台源数据:

a.首先得有一个源数据的类​

class Students

{

public string Id { get; set; }

public string Name { get; set; }

public string Age { get; set; }

//省略了字段,直接来属性​

}


b.然后需要一个数据集合

ObservableCollection stuList​ = new ObservableCollection()

{

new Students(){Id = "0",Name = "Tim",Age = "29"},

new Students(){Id = "1",Name = "Tom",Age = "28"},

new Students(){Id = "2",Name = "Kyle",Age = "30"},

};
//这里面可以直接用List集合,但是一般来说在可以修改的DataGrid里面,需要一个及时更新的机制,所以如果使用List集合,就必须实现​INotifyPropertyChanged接口,接口的具体实现我将在下篇中详细讲述。因为ObservableCollection集合自带了更新的接口,所以直接用这个会比较方便。


c.​前端DataGrid的数据绑定

<DataGrid x:Name="DataGrid" HorizontalAlignment="Left" Height="Auto" Margin="81,125,0,0" VerticalAlignment="Top" Width="Auto" BorderThickness="0" HeadersVisibility="Column" >

<DataGrid.Columns>

<DataGridTextColumn Header="id" Binding="{Binding id,Mode=TwoWay}"/>

<DataGridTextColumn Header="title" Binding="{Binding title,Mode=TwoWay}" />

</DataGrid.Columns>

</DataGrid>

//这边要注意的是首列隐藏HeadersVisibility,会让整体表格看起来美观;自动创建列AutoGenerateColumns设置为False ; 另外就是绑定的模式TwoWay


d​.将数据源关联至控件中

this.DataGrid.ItemsSource = stuList;
//这边还可以使用DataContext的方法,暂时还没弄懂,后续会有跟进


再看​数据库的源数据:

a.先设定访问数据库的参数

public static string sqlcon = "Data Source=****\\SQLEXPRESS;Initial Catalog=*********;Persist Security Info=True;User ID=sa;Password=**********";

//这是数据库的地址


b.打开数据库

SqlConnection conn = new SqlConnection(sqlcon);

conn.Open();​

//然后是创建数据库链接并打开


c.​查询内容

SqlDataAdapter SQLda = new SqlDataAdapter(“select * from book”, conn);

DataSet My_Da
9a0d
taSet = new DataSet();

SQLda.Fill(My_DataSet, "book");

//然后是数据库查询语句,并且将集合放置在DataSet容器内


d.​将内容关联至控件中

DataGrid.ItemsSource = My_DataSet.Tables["book"].DefaultView;​
//前端的绑定和后台数据显示类似就不多写了,注意的是字段的名称不要出错。但这里面仅仅是显示用。下面分开介绍修改的内容。


2.内容修改—后台源数据

由于使用了TwoWay模式,在DataGrid上面的修改被直接更新:

​stuList.Add(new Students() { Id = "4", Name = "shao", Age = "29" });

//新增方法

stuList.RemoveAt(this.DataGrid.SelectedIndex);​

//删除方法

//实战中后台源数据的使用较少就不多做深入了。下面主要说明数据库源数据的修改


​ 3.内容修改—数据库源数据

a.做一个UpdateDatabase的方法,用于更新修改后的内容


public static void UpdateDatabase(DataTable table)

{

try

{

DataBase.getcon();//这边有一个打开数据库链接的部分就省略了

SqlDataAdapter adapter = new SqlDataAdapter("select * from book", DataBase.conn);

SqlCommandBuilder cb = new SqlCommandBuilder(adapter);//更改相协调?

cb.GetUpdateCommand();

adapter.Update(table);//用于更新---有一个返回int的方法重载。但是值不对。

//table.AcceptChanges();//----这个东西慎用,一旦用了就停止更新。

//上面实现了类似EXCEL一样的,修改完毕就自动更新的机制,这句代码阻止了其发生

}
catch (SqlException ex)

{

MessageBox.Show(ex.Message);

table.RejectChanges();//回滚方法

}

}


b.​放置一个用于确认更新的按钮,添加Click事件


if (DataGrid.ItemsSource != null)

{

UpdateDatabase((DataGrid.ItemsSource as DataView).Table);

}

//至此,数据库的更新就完成了,修改,新增,删除,都可以依靠此按钮进行更新


PS:下面介绍一下即刻更新的方法

a.​首先需要新增一个Rowchanged方法,这个方法不是DataGrid内的,而是DataRow里面的,需要手动添加。


private void ds_Rowchanged(object sender, DataRowChangeEventArgs e)

{

//throw new NotImplementedException();

UpdateDatabase(e.Row.Table);

}


b​.其次在数据关联之前插入此事件


My_DataSet.Tables["book"].RowChanged += new DataRowChangeEventHandler(ds_Rowchanged);

DataGrid.ItemsSource = My_DataSet.Tables["book"].DefaultView;

//这边要注意的是,至此只能对内容修改进行即刻的更新,如果有新增,也可以更新,但是如果有删除,就无法更新。需要之前的那个更新确认按钮Click事件再次触发才行。具体原因,是因为这个自动更新针对的是Row,而不是DataGrid。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: