本内容分为三大块:
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。