在DataGrid中加入ComboBox資料行,並做資料繫結,且需要轉換資料再顯示。
準備資料庫資料:
資料表名稱:GauItems
Idx欄位: 索引,資料型態int,主鍵,識別欄位。
ID欄位: 品號,資料型態varchar(10),not Null。
InspectRule欄位: 檢測模式,資料型態int,not Null。
InspectRule欄位資料中,
1 代表「每次檢測」,
2 代表「每周檢測」,
3 代表「每月檢測」,
4 代表「每年檢測」。
在資料呈現時,InspectRule欄位不可以用1、2、3、4,
而是要轉換成「每次檢測」、「每周檢測」...等資料。
首先,使用Xaml語法建立一個DataGrid及其資料欄位:「品號」和「檢測模式」,
「品號」使用DataGridTextColumn呈現,並設定Binding屬性繫結至ID資料欄位,
「檢測模式」使用DataGridComboBoxColumn呈現,並設定SelectedItemBinding屬性繫結至InspectRule資料欄位。
Xaml語法如下:
<DataGrid x:Name="DataGrid1" ItemsSource="{Binding}" Margin="10,10,9.8,9.8"
AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTextColumn Header="品號" Binding="{Binding ID}" />
<DataGridComboBoxColumn x:Name="ComboBoxColumn1" Header="檢測模式"
SelectedItemBinding="{Binding InspectRule}"/>
</DataGrid.Columns>
</DataGrid>
接著,在Code-Behind中取得資料庫資料表並設定資料來源以完成資料繫結。
Code-Behind的C#語法如下:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//從資料庫取得DataTable並轉成DataView作為DataGrid1的資料來源。
//在此由於ItemsSource型態為IEnumerable所以需要將DataTable轉成DataView。
this.DataGrid1.ItemsSource = GetDataTable().DefaultView;
//Combobox用的下拉選項資料。
List<int> list1 = new List<int>() { 1, 2, 3, 4 };
//設定ComboBoxColumn1下拉選項的資料來源。
this.ComboBoxColumn1.ItemsSource = list1;
}
//抓資料庫裡的資料表
public DataTable GetDataTable()
{
SqlConnectionStringBuilder sb = new SqlConnectionStringBuilder();
sb.DataSource = @"(localdb)\v11.0";
sb.InitialCatalog = "Demo";
SqlConnection con = new SqlConnection(sb.ConnectionString);
SqlCommand cmd = new SqlCommand();
SqlDataAdapter ada = new SqlDataAdapter();
DataTable dt = new DataTable();
con.Open();
cmd.Connection = con;
ada.SelectCommand = cmd;
string cmdtxt = @"select ID, InspectRule from GauItems";
cmd.CommandText = cmdtxt;
ada.Fill(dt);
con.Close();
return dt;
}
到此,資料已可呈現,且ComboBox欄位的下拉選單也有資料可以做選擇,如下圖。
目前「檢測模式」顯示的資料完全是資料庫中的資料,
要讓使用者更容易明白必須改以中文顯示。
至「方案總管」加入轉換用的「類別」,如下圖。
我將此轉換用的類別命名為:InspectRuleConverter.cs。
InspectRuleConverter類別實作IValueConverter介面以達到資料轉換的目的。
首先,匯入IValueConverter介面的命名空間(namespace):System.Windows.Data。
接著,將InspectRuleConverter類別繼承IValueConverter介面。
之後,撰寫IValueConverter介面的Convert及ConvertBack方法。
程式碼如下:
using System;
using System.Globalization;
using System.Windows.Data;
namespace WpfApplication1
{
public class InspectRuleConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
int temp = (int)value;
switch (temp)
{
case 1:
return "每次檢測";
case 2:
return "每周檢測";
case 3:
return "每月檢測";
case 4:
return "每年檢測";
default:
return "每次檢測";
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
string temp = value.ToString();
switch (temp)
{
case "每次檢測":
return 1;
case "每周檢測":
return 2;
case "每月檢測":
return 3;
case "每年檢測":
return 4;
default:
return 1;
}
}
}
}
寫完InspectRuleConverter類別後,就要拿到Xaml中使用,
首先,加入Windows的Resource標籤,在Resource標籤內加入InspectRuleConverter類別。
接著,在ComboboxColumn的SelectedItemBinding中設定Converter屬性為InspectRuleConverter。
之後,還必需修改ComboboxColumn的下拉選項資料來源為轉換後的資料(每次檢測、每周檢測...等)。
在Xaml語法加入Window的Resources標籤如下:
<Window.Resources>
<local:InspectRuleConverter x:Key="InspectRuleConverter"/>
</Window.Resources>
在Xaml語法設定ComboboxColumn的SelectedItemBinding修改如下:
<DataGridComboBoxColumn x:Name="ComboBoxColumn1" Header="檢測模式"
SelectedItemBinding="{Binding InspectRule, Converter={StaticResource InspectRuleConverter}}"/>
修改ComboboxColumn的下拉選項資料來源,
Code-Behind C#語法修改如下:
//List<int> list1 = new List<int>() { 1, 2, 3, 4 };
List<string> list1 = new List<string>() { "每次檢測", "每周檢測", "每月檢測", "每年檢測" };
到此完成設計,
成果如下圖: