<h1>DataGrid示例(二) - <span class="color_h1">(二十一)</span></h1><p><br/></p><h1 style="font-size: 16px;font-weight:bold">DataGrid示例的后台代码</h1><p> 1)通过从本地数据库中的S_City表中读取城市信息数据,从S_ Province表中读取省份信息,然后通过绑定的方式反数据显示到WPF的Window上的一个DataGrid上。具体代码如下。</p><p><br/></p><p>MainWindow.xaml.cs代码如下:</p><pre style="overflow-x:auto;font-size: 15px;" class="brush:c#;toolbar:false;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using WpfApp.MySql;
namespace WpfApp
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public List<d_Province> ProvinceList { get; set; }
MyDbContext MyDb = new MyDbContext();
public MainWindow()
{
InitializeComponent();
InitMySql();
}
/// <summary>
/// 初始化数据库
/// </summary>
private void InitMySql()
{
MyDb.Database.EnsureCreated();
// 新建的数据库没有数据,这里添加一些
if (MyDb.S_City.Count() == 0)
{
MyDbContext db = new MyDbContext();
for (int i = 0; i < 10; i++)
{
d_City d = new d_City();
d.CityName = $"AAA{i}";
d.ZipCode = $"100{i}";
d.ProvinceID = i;
d.DateCreated = DateTime.Now;
d.DateUpdated = DateTime.Now.AddDays(i);
db.S_City.Add(d);
db.SaveChanges();
d_Province p = new d_Province();
p.CityName = $"AAA{i}";
p.ProvinceID = i;
p.ProvinceName = $"BBB{i}";
db.S_Province.Add(p);
db.SaveChanges();
}
db.Dispose();
}
}
private void btnRefresh_Click(object sender, RoutedEventArgs e)
{
BindDrp();
GetData();
}
protected void GetData()
{
List<d_City> list = MyDb.S_City.ToList<d_City>();
gridCitys.ItemsSource = list;
}
protected void BindDrp()
{
ProvinceList = MyDb.S_Province.ToList();
cboProvince.ItemsSource = ProvinceList;
}
private void btnUpdate_Click(object sender, RoutedEventArgs e)
{
try
{
d_City city = (d_City)gridCitys.SelectedItem;
city.DateUpdated = DateTime.Now;
txtMsg.Text = city.ProvinceID + "//" + city.CityName;
d_City modifyCity = MyDb.S_City.Find(city.CityID);
modifyCity = city;
MyDb.SaveChanges();
txtMsg.Text += "保存成功!";
}
catch (Exception ex)
{
txtMsg.Text += ex.Message;
}
}
}
}</pre><p><br/></p><p>d_Province.cs代码如下:</p><pre style="overflow-x:auto;font-size: 15px;" class="brush:c#;toolbar:false;">namespace WpfApp.MySql
{
public class d_Province
{
public int id { get; set; }
public long ProvinceID { get; set; }
public string CityName { get; set; }
public string ProvinceName { get; set; }
}
}</pre><p><br/></p><p> 2)写完了上面的代码之后,按F5,程序运行了起来,点“刷新”。你会看到如下结果。DataGrid自动生成了一些列,而实际上我们是不需要这些自动生成列的。所以需要把AutoGenerateColumns设为False。再执行第2步。就会看到如下的结果。</p><p><img class="pimg" src="/upload/image/微信截图_20211206102737.gif"/></p><p><br/></p><p> 3)虽然实现了下拉框的内容显示,但是却存在一个问题,继不显示应该显示的内容。最后查询网络之后才知道,应许做如下修改。</p><p><br/></p><h1 style="font-size: 16px;font-weight:bold">DataGrid的ComboBox列的绑定方式</h1><p> DataGridComboBoxColumn对数据源有下面的要求:</p><p> 使用下列选项之一,若要填充下拉列表,首先设置 ComboBox 的 ItemsSource 属性:</p><p> 1、静态资源。有关更多信息,请参见 StaticResource 标记扩展。</p><p> 2、x: 静态代码实体。有关更多信息,请参见 x:Static 标记扩展。</p><p> 3、ComboBoxItem 类型的内联集合。</p><p> </p><p> 1)在使用DataGrid的时候,有时候需要使某些列为ComboBox,这时自然想到使用DataGridComboBoxColumn,但是如果使用的是ItemsSource数据绑定后台的对象,就会发现,这根本就不能用。</p><p><br/></p><p> 2)默认刷新按钮之后,下拉框中没有数据。我仔细看了一下代码,前台代码中并没有进行数据绑定,而且后台代码中也没写绑定的语句。前台代码如下。</p><pre style="overflow-x:auto;font-size: 15px;" class="brush:xml;toolbar:false;"><DataGridComboBoxColumn x:Name="cboProvince" ClipboardContentBinding="{x:Null}" Header="ProvinceID"
SelectedValuePath="ProvinceID" SelectedValueBinding="{Binding Path=ProvinceID,UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="ProvinceName" SelectedItemBinding="{x:Null}" ></DataGridComboBoxColumn></pre><p><br/></p><p> 3)我对程序进行了一些修改,前台代码不做修改,还是如下。</p><pre style="overflow-x:auto;font-size: 15px;" class="brush:xml;toolbar:false;"><DataGridComboBoxColumn x:Name="cboProvince" ClipboardContentBinding="{x:Null}" Header="ProvinceID"
SelectedValueBinding="{x:Null}" SelectedItemBinding="{x:Null}" TextBinding="{x:Null}"/></pre><p><br/></p><p> 后台代码如下,进行了下拉框的绑定</p><pre style="overflow-x:auto;font-size: 15px;" class="brush:c#;toolbar:false;">protected void BindDrp()
{
ProvinceList = MyDb.S_Province.ToList();
cboProvince.ItemsSource = ProvinceList;
}</pre><p><br/></p><p> 结果如下图。绑定是成功了,但是不显示我需要显示的值。</p><p><img class="pimg" src="/upload/image/微信截图_20211206103639.jpg"/></p><p><br/></p><p> 4)对前台代码进行了如下修改。对DataGridComboBoxColumn进行了绑定。然后F5,运行发现,下拉框的显示是正常了,但是不论我怎么改,DataGrid中的“ProvinceID”默认只是显示空白,什么也不显示,如下图。前台代码如下。</p><pre style="overflow-x:auto;font-size: 15px;" class="brush:xml;toolbar:false;"><DataGridComboBoxColumn x:Name="cboProvince" ClipboardContentBinding="{x:Null}" Header="ProvinceID"
SelectedValuePath="ProvinceID" DisplayMemberPath="ProvinceName"
SelectedItemBinding="{x:Null}" TextBinding="{Binding ProvinceName}"/></pre><p><img class="pimg" src="/upload/image/微信截图_20211206104449.gif"/></p><p><br/></p><p> 5)但是当我加载数据到DataGrid中时,ProvinceID列默认还是为空,并没有显示我想显示的省份名称这样的数据。经过一番的查找与学习,最终把前台代码修改成如下。这样修改之后在DataGrid默认绑定数据之后,ProvinceID列达到了我想要的结果。如下图。</p><pre style="overflow-x:auto;font-size: 15px;" class="brush:xml;toolbar:false;"><DataGridComboBoxColumn x:Name="cboProvince" ClipboardContentBinding="{x:Null}" Header="ProvinceID"
SelectedValuePath="ProvinceID" SelectedValueBinding="{Binding Path=ProvinceID,UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="ProvinceName" SelectedItemBinding="{x:Null}" >
</DataGridComboBoxColumn></pre><p><img class="pimg" src="/upload/image/微信截图_20211206104805.gif"/></p><p><br/></p><p>源码下载:</p><p><a target="_blank" href="api/system/download?file=Wpf%E5%AD%A6%E4%B9%A0%EF%BC%88DataGrid%E7%A4%BA%E4%BE%8B1%EF%BC%89.zip">Wpf学习(DataGrid示例1).zip</a></p>
DataGrid示例(二) - (二十一)
DataGrid示例的后台代码 1)通过从本地数据库中的S_City表中读取城市信息数据,从S_ Province表中读取省份信息,然后通过绑定的方式反数据显示到WPF的Window上的一个DataGrid上。具体代码如下。
MainWindow.xaml.cs代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using WpfApp.MySql;
namespace WpfApp
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public List<d_Province> ProvinceList { get; set; }
MyDbContext MyDb = new MyDbContext();
public MainWindow()
{
InitializeComponent();
InitMySql();
}
/// <summary>
/// 初始化数据库
/// </summary>
private void InitMySql()
{
MyDb.Database.EnsureCreated();
// 新建的数据库没有数据,这里添加一些
if (MyDb.S_City.Count() == 0)
{
MyDbContext db = new MyDbContext();
for (int i = 0; i < 10; i++)
{
d_City d = new d_City();
d.CityName = $"AAA{i}";
d.ZipCode = $"100{i}";
d.ProvinceID = i;
d.DateCreated = DateTime.Now;
d.DateUpdated = DateTime.Now.AddDays(i);
db.S_City.Add(d);
db.SaveChanges();
d_Province p = new d_Province();
p.CityName = $"AAA{i}";
p.ProvinceID = i;
p.ProvinceName = $"BBB{i}";
db.S_Province.Add(p);
db.SaveChanges();
}
db.Dispose();
}
}
private void btnRefresh_Click(object sender, RoutedEventArgs e)
{
BindDrp();
GetData();
}
protected void GetData()
{
List<d_City> list = MyDb.S_City.ToList<d_City>();
gridCitys.ItemsSource = list;
}
protected void BindDrp()
{
ProvinceList = MyDb.S_Province.ToList();
cboProvince.ItemsSource = ProvinceList;
}
private void btnUpdate_Click(object sender, RoutedEventArgs e)
{
try
{
d_City city = (d_City)gridCitys.SelectedItem;
city.DateUpdated = DateTime.Now;
txtMsg.Text = city.ProvinceID + "//" + city.CityName;
d_City modifyCity = MyDb.S_City.Find(city.CityID);
modifyCity = city;
MyDb.SaveChanges();
txtMsg.Text += "保存成功!";
}
catch (Exception ex)
{
txtMsg.Text += ex.Message;
}
}
}
}
d_Province.cs代码如下:
namespace WpfApp.MySql
{
public class d_Province
{
public int id { get; set; }
public long ProvinceID { get; set; }
public string CityName { get; set; }
public string ProvinceName { get; set; }
}
}
2)写完了上面的代码之后,按F5,程序运行了起来,点“刷新”。你会看到如下结果。DataGrid自动生成了一些列,而实际上我们是不需要这些自动生成列的。所以需要把AutoGenerateColumns设为False。再执行第2步。就会看到如下的结果。
3)虽然实现了下拉框的内容显示,但是却存在一个问题,继不显示应该显示的内容。最后查询网络之后才知道,应许做如下修改。
DataGrid的ComboBox列的绑定方式 DataGridComboBoxColumn对数据源有下面的要求:
使用下列选项之一,若要填充下拉列表,首先设置 ComboBox 的 ItemsSource 属性:
1、静态资源。有关更多信息,请参见 StaticResource 标记扩展。
2、x: 静态代码实体。有关更多信息,请参见 x:Static 标记扩展。
3、ComboBoxItem 类型的内联集合。
1)在使用DataGrid的时候,有时候需要使某些列为ComboBox,这时自然想到使用DataGridComboBoxColumn,但是如果使用的是ItemsSource数据绑定后台的对象,就会发现,这根本就不能用。
2)默认刷新按钮之后,下拉框中没有数据。我仔细看了一下代码,前台代码中并没有进行数据绑定,而且后台代码中也没写绑定的语句。前台代码如下。
<DataGridComboBoxColumn x:Name="cboProvince" ClipboardContentBinding="{x:Null}" Header="ProvinceID"
SelectedValuePath="ProvinceID" SelectedValueBinding="{Binding Path=ProvinceID,UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="ProvinceName" SelectedItemBinding="{x:Null}" ></DataGridComboBoxColumn>
3)我对程序进行了一些修改,前台代码不做修改,还是如下。
<DataGridComboBoxColumn x:Name="cboProvince" ClipboardContentBinding="{x:Null}" Header="ProvinceID"
SelectedValueBinding="{x:Null}" SelectedItemBinding="{x:Null}" TextBinding="{x:Null}"/>
后台代码如下,进行了下拉框的绑定
protected void BindDrp()
{
ProvinceList = MyDb.S_Province.ToList();
cboProvince.ItemsSource = ProvinceList;
}
结果如下图。绑定是成功了,但是不显示我需要显示的值。
4)对前台代码进行了如下修改。对DataGridComboBoxColumn进行了绑定。然后F5,运行发现,下拉框的显示是正常了,但是不论我怎么改,DataGrid中的“ProvinceID”默认只是显示空白,什么也不显示,如下图。前台代码如下。
<DataGridComboBoxColumn x:Name="cboProvince" ClipboardContentBinding="{x:Null}" Header="ProvinceID"
SelectedValuePath="ProvinceID" DisplayMemberPath="ProvinceName"
SelectedItemBinding="{x:Null}" TextBinding="{Binding ProvinceName}"/>
5)但是当我加载数据到DataGrid中时,ProvinceID列默认还是为空,并没有显示我想显示的省份名称这样的数据。经过一番的查找与学习,最终把前台代码修改成如下。这样修改之后在DataGrid默认绑定数据之后,ProvinceID列达到了我想要的结果。如下图。
<DataGridComboBoxColumn x:Name="cboProvince" ClipboardContentBinding="{x:Null}" Header="ProvinceID"
SelectedValuePath="ProvinceID" SelectedValueBinding="{Binding Path=ProvinceID,UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="ProvinceName" SelectedItemBinding="{x:Null}" >
</DataGridComboBoxColumn>
源码下载:
Wpf学习(DataGrid示例1).zip