[C#][WPF]在DataGrid中加入ComboBox資料行,並做資料繫結、資料轉換

  • 7081
  • 0
  • 2016-04-07

在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>() { "每次檢測", "每周檢測", "每月檢測", "每年檢測" };

到此完成設計,
成果如下圖: