DataGrid示例的后台代碼
1) 通過Entity Framework 6.1 從數據庫(本地數據庫(local)/Test中的S_City表中讀取城市信息數據,從S_ Province表中讀取省份信息,然后通過綁定的方式反數據顯示到WPF的Window上的一個DataGrid上。具體代碼如下。
using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data.Entity; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; using WpfApp1.Models; namespace WpfApp1 { /// <summary> /// WindowGrid.xaml 的交互邏輯 /// </summary> public partial class WindowGrid : Window { public WindowGrid() { InitializeComponent(); Database.SetInitializer<TestDBContext>(null); } private void btnRefresh_Click(object sender, RoutedEventArgs e) { BindDrp(); GetData(); } TestDBContext db = new TestDBContext(); protected void GetData() { List<S_City> list = db.S_City.ToList<S_City>(); gridCitys.ItemsSource = list; } protected void BindDrp() { List<S_Province> list = db.S_Province.ToList<S_Province>(); cboProvince.ItemsSource = list; ProvinceList = list; } public List<S_Province> ProvinceList { get; set; } private void btnUpdate_Click(object sender, RoutedEventArgs e) { try { S_City city = (S_City)gridCitys.SelectedItem; city.DateUpdated = DateTime.Now; txtMsg.Text = city.ProvinceID + "//" + city.CityName; S_City modifyCity = db.S_City.Find(city.CityID); modifyCity = city; db.SaveChanges(); txtMsg.Text += "保存成功!"; } catch (Exception ex) { txtMsg.Text += ex.Message; } } } }
2) 寫完了上面的代碼之后,按F5,程序運行了起來,點“刷新”。你會看到如下結果。如下圖的結果。
3) DataGrid自動生成了一些列,而實際上我們是不需要這些自動生成列的。所以需要把AutoGenerateColumns設為False。再執行第2步。就會看到如下的結果。
4) 雖然實現了下拉框的內容顯示,但是卻存在一個問題,繼不顯示應該顯示的內容。最后查詢網絡之后才知道,應許做如下修改。
DataGrid的ComboBox列的綁定方式
DataGridComboBoxColumn對數據源有下面的要求:
使用下列選項之一,若要填充下拉列表,首先設置 ComboBox 的 ItemsSource 屬性:
- 1、靜態資源。有關更多信息,請參見 StaticResource 標記擴展。
- 2、x: 靜態代碼實體。有關更多信息,請參見 x:Static 標記擴展。
- 3、ComboBoxItem 類型的內聯集合。
1) 在使用DataGrid的時候,有時候需要使某些列為ComboBox,這時自然想到使用DataGridComboBoxColumn,但是如果使用的是ItemsSource數據綁定后台的對象,就會發現,這根本就不能用。
2) 默認刷新按鈕之后,下拉框中沒有數據。我仔細看了一下代碼,前台代碼中並沒有進行數據綁定,而且后台代碼中也沒寫綁定的語句。前台代碼如下。如果如下圖。
<DataGridComboBoxColumn ClipboardContentBinding="{x:Null}" Header="ProvinceID" SelectedValueBinding="{x:Null}" SelectedItemBinding="{x:Null}" TextBinding="{x:Null}"/>
3) 我對程序進行了一些修改,前台代碼不做修改,還是如下。
<DataGridComboBoxColumn x:Name="cboProvince" ClipboardContentBinding="{x:Null}" Header="ProvinceID" SelectedValueBinding="{x:Null}" SelectedItemBinding="{x:Null}" TextBinding="{x:Null}"/>
后台代碼如下,進行了下拉框的綁定。
protected void BindDrp() { List<S_Province> list = db.S_Province.ToList<S_Province>(); cboProvince.ItemsSource = list; }
結果如下圖。綁定是成功了,但是不顯示我需要顯示的值。
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>