C#でDataTableの自動インクリメントをしてみた

データベースのデータをDataTableに読み込んでいろいろしていると、DataTableにレコードを追加したときにオートインクリメントして欲しい場合があります。ということで、DataTableのカラムにAutoIncrementの設定をしてみました。

目次

  1. 環境
  2. 自動インクリメントの手順
  3. 試してみた
    1. 試すのに使うアプリ
  4. 自動インクリメントしないとこんな感じ
  5. 自動インクリメントの設定をしてみる
  6. インクリメントの条件を変えてみた

環境

  • Visual Studio 2015 Express for Windows Desktop

自動インクリメントの手順

DataColumnクラス のAutoIncrementプロパティをtrueにすると、レコードを追加したときにそのカラムの値を自動インクリメントします。

関連するプロパティがいくつかあるので、下表にメモっておきます。

プロパティ

規定値

内容

AutoIncrement

Boolean

false

自動インクリメントする場合はtrue、しない場合はfalse。

AutoIncrementSeed

Int64

0

自動インクリメントの開始値。

AutoIncrementStep

Int64

1

自動インクリメントする数値。

試してみた

試すのに使うアプリ

ウィンドウにデータグリッドを1つだけ配置したアプリを作ります。コードの側でDataTableを1つ作ってデータバインディングします。

XAMLはこんな感じです。

<Window x:Class="autoincrement_trial.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:autoincrement_trial"
        mc:Ignorable="d"
        Title="MainWindow" Height="200" Width="200">
    <Grid>
        <DataGrid Name="datagrid" ItemsSource="{Binding}" />
    </Grid>
</Window>

Grid要素の中にDataGrid要素を置いただけですね。

自動インクリメントしないとこんな感じ

まず、カラムに自動インクリメントしないとどうなるかみてみます。

DataTableにはカラムを2つ設定します。1つ目のカラムはField1という名前にして、データ型をlong(Int64)にします。IDとかに使う想定です。2つ目のカラムはField2という名前にして、データ型をstringにします。実データを入れる想定です。Field2のカラムに文字列データ入れたレコードを追加していきます。

コードはこんな感じです。

using System;
using System.Windows;
using System.Data;

namespace autoincrement_trial
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            DataTable table = new DataTable();

            DataColumn column1 = new DataColumn();
            column1.ColumnName = "Field1";
            column1.DataType = Type.GetType("System.Int64");
            table.Columns.Add(column1);

            DataColumn column2 = new DataColumn();
            column2.ColumnName = "Field2";
            column2.DataType = Type.GetType("System.String");
            table.Columns.Add(column2);

            datagrid.DataContext = table;

            string[] str = { "ち", "は", "や", "ふ", "る" };

            foreach (string t in str)
            {
                DataRow row = table.NewRow();
                row[1] = t;
                table.Rows.Add(row);
            }
        }
    }
}

実行結果は下図の様になります。

インクリメント無しの結果

Field1には値が入っていませんね。

自動インクリメントの設定をしてみる

自動インクリメントしてみます。コードを下記の様にします。

using System;
using System.Windows;
using System.Data;

namespace autoincrement_trial
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            DataTable table = new DataTable();

            DataColumn column1 = new DataColumn();
            column1.ColumnName = "Field1";
            column1.DataType = Type.GetType("System.Int64");
            column1.AutoIncrement = true;
            table.Columns.Add(column1);

            DataColumn column2 = new DataColumn();
            column2.ColumnName = "Field2";
            column2.DataType = Type.GetType("System.String");
            column2.AutoIncrement = false;
            table.Columns.Add(column2);

            datagrid.DataContext = table;

            string[] str = { "ち", "は", "や", "ふ", "る" };

            foreach (string t in str)
            {
                DataRow row = table.NewRow();
                row[1] = t;
                table.Rows.Add(row);
            }
        }
    }
}

カラムの設定の部分に、AutoIncrementプロパティをtrueに設定する文を追加しました。

実行すると下図の様になります。

インクリメント有りの結果

レコードを追加するときにはField1の値は設定していないのですが、連番が各レコードに自動的に振られました。便利ですね。

インクリメントの条件を変えてみた

AutoIncrementSeedとAutoIncrementStepを試してみます。

例えば、開始値を10にして、インクリメント値を-1にしてみます。

using System;
using System.Windows;
using System.Data;

namespace autoincrement_trial
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            DataTable table = new DataTable();

            DataColumn column1 = new DataColumn();
            column1.ColumnName = "Field1";
            column1.DataType = Type.GetType("System.Int64");
            column1.AutoIncrement = true;
            column1.AutoIncrementSeed = 10;
            column1.AutoIncrementStep = -1;
            table.Columns.Add(column1);

            DataColumn column2 = new DataColumn();
            column2.ColumnName = "Field2";
            column2.DataType = Type.GetType("System.String");
            column2.AutoIncrement = false;
            table.Columns.Add(column2);

            datagrid.DataContext = table;

            string[] str = { "ち", "は", "や", "ふ", "る" };

            foreach (string t in str)
            {
                DataRow row = table.NewRow();
                row[1] = t;
                table.Rows.Add(row);
            }
        }
    }
}

実行結果は下図の様になります。

デクリメント

10からカウントダウンしてますね。こういう使い方することがあるかどうかわかりませんが。

公開日

広告