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

来源:互联网 发布:超人软件 编辑:程序博客网 时间:2024/06/06 09:45

本内容分为三大块:

  1. DataGrid数据绑定显示

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

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

    1. 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_DataSet = 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。
0 0
原创粉丝点击