C#でDataTableの自動インクリメントをしてみた
データベースのデータをDataTableに読み込んでいろいろしていると、DataTableにレコードを追加したときにオートインクリメントして欲しい場合があります。ということで、DataTableのカラムにAutoIncrementの設定をしてみました。
目次
環境
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からカウントダウンしてますね。こういう使い方することがあるかどうかわかりませんが。
公開日
広告
C#でデータ処理カテゴリの投稿
- C#でDataAdapterを使ってAccessのデータベースを読み書きしてみた
- C#でDataAdapterを使ってAccessのデータベースを読み書きしてみた(OleDb編)
- C#でDataGridに表示するデータを操作してみた
- C#でDataTableのカラムのデータ型を読んでみた
- C#でDataTableの自動インクリメントをしてみた
- C#でJSON形式のデータを出力してみた
- C#でLinq to objectの結果をDataTableにしてみた
- C#でSQLite3のデータベースを使ってみる(ADO.NET ファクトリーデザインパターン)
- C#でSQLiteを使ってみる(インストール)
- C#でコレクションの要素の数を調べる
- C#でコレクションを内部結合してみた
- C#でコレクションを左外部結合してみた
- C#でコレクションを昇順または降順に並び替える
- C#で渡された配列を加工して配列で返す関数について注意すること
- C#のキューを試してみた
- C#のスタックを試してみた