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

本内容分为三大块:

  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。

你可能感兴趣的:(WPF)