質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

4回答

29454閲覧

.net DataTableに列を一括で追加する方法

xo001122

総合スコア13

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2017/06/01 17:15

編集2022/01/12 10:55

お世話になっております。

表題の通り、DataTableへの列追加を一括で追加できないものか、と考えております。
"一括で追加"という表現が正しいのか分かりませんが...。

現在以下のようにして、同じレイアウトのDataTableを作成しています。

Vb.Net

1dim table1 as new datatable 2table1.colums.add("teru1") 3table1.colums.add("teru2") 4table1.colums.add("teru3") 5 6dim table2 as new datatable 7table1.colums.add("teru1") 8table1.colums.add("teru2") 9table1.colums.add("teru3") 10 11dim table3 as new datatable 12table1.colums.add("teru1") 13table1.colums.add("teru2") 14table1.colums.add("teru3") 15

この追加方法だと同じことを何度も書かなくてはいけなく、コーディング量が増えるのであまり好みではないです。
そこで、列だけを宣言した列挙体のようなものを作成し、それをDataTableの列として追加できないかと考えました。

しかしいい方法が思い浮かばず、とりあえず以下のように列を追加したDataTableを作成し、それを突っ込むというちょっと強引?な方法をとっています。

Vb.Net

1dim temp_table as new datatable 2temp_table.colums.add("retu1") 3temp_table.colums.add("retu2") 4temp_table.colums.add("retu3") 5 6dim table1 as datatable = temp_table 7dim table2 as datatable = temp_table 8dim table3 as datatable = temp_table

1度作成した列のかたまりを流用するようなイメージです。
他にもっと良い(スマート or パフォーマンスが良い)方法があれば、ご教授いただけないでしょうか。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

DataTableのCopyとか、Cloneとか、DataTableのコレクションに対して処理を書き分けるとか、根本的にDataTableを使うのを止めるとか
そもそもDataTableを使ってて、パフォーマンスとか云々言っちゃダメな気がするのは私だけ?

投稿2017/06/01 19:46

dojikko

総合スコア3939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xo001122

2017/06/02 00:25

list使った方がいい、みたいな記事見かけたことありますが…。今回はdatatableで考えたいです。よろしくお願いします。
guest

0

パフォーマンスを求めるなら、下記の様にListを使うと良いと思います。
意外と遅い DataTable 、なので List を使うと 5 倍早くなる

個人的には、各カラムの定義も分かり易くなるので好きですね。

Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim dataList As New List(Of testTable) Dim testTable As New testTable testTable.col1 = "あ" testTable.col2 = "い" testTable.col3 = "う" dataList.Add(testTable) DataGridView1.DataSource = dataList End Sub End Class Public Class testTable Public Property col1 As String Public Property col2 As String Public Property col3 As String End Class

投稿2017/06/02 00:53

motuo

総合スコア3027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

DataTableへの列追加を一括で追加できないものか、と考えております。

列の追加だけが目的ではなく、その後何らかのデータソースからデータを取得して DataTable に行を追加するのですよね?

であれば、そのデータソースは何でしょう?

DataTable は ADO.NET ライブラリ内の中心的オブジェクトということで、データソースが SQL Server, MySQL, Access などのデータベースであれば、例えば ADO.NET の DataAdapter を使って、データソースから自動的に DataTable に列と行を追加してくれるので、今回質問者さんが問題としていることに悩む必要はないのですが。

データソースは CSV, XML などでも OK です。

投稿2017/06/02 02:30

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

書き方は色々あると思います。

C#

1Sub Main() 2 Dim table1 As DataTable = CreateTeruDataTable() 3 Dim table2 As DataTable = CreateTeruDataTable() 4 Dim table3 As DataTable = CreateTeruDataTable() 5End Sub 6 7Private Function CreateTeruDataTable() As DataTable 8 Using dt As New DataTable() 9 dt.Columns.Add("teru1") 10 dt.Columns.Add("teru2") 11 dt.Columns.Add("teru3") 12 Return dt 13 End Using 14End Function

C#

1Using table1 As New DataTable(), 2 table2 As New DataTable(), 3 table3 As New DataTable() 4 For Each tbl In {table1, table2, table3} 5 tbl.Columns.Add("teru1") 6 tbl.Columns.Add("teru2") 7 tbl.Columns.Add("teru3") 8 Next 9End Using

あとはディープコピーするとか。

【追記】
最後まで書き込みを見てませんでした。
最後に書かれているやり方だと、table1~3が同一の実体を指す事になり、table1に対する変更などがtable2にもtable3にも起こることになりますが大丈夫でしょうか。

【追記2】
xo001122さんのコード

C#

1Sub Main() 2 Dim temp_table As New DataTable 3 temp_table.Columns.Add("retu1") 4 temp_table.Columns.Add("retu2") 5 temp_table.Columns.Add("retu3") 6 7 Dim table1 As DataTable = temp_table 8 Dim table2 As DataTable = temp_table 9 Dim table3 As DataTable = temp_table 10 11 ' table1に1行追加してそれぞれのDataTableの行数を表示 12 table1.Rows.Add() 13 Console.WriteLine("table1の行数:{0}", table1.Rows.Count) ' 114 Console.WriteLine("table2の行数:{0}", table2.Rows.Count) ' 115 Console.WriteLine("table3の行数:{0}", table3.Rows.Count) ' 116 17 Console.ReadLine() 18End Sub

私のコード。

C#

1Sub Main() 2 Using table1 As New DataTable(), 3 table2 As New DataTable(), 4 table3 As New DataTable() 5 For Each tbl In {table1, table2, table3} 6 tbl.Columns.Add("teru1") 7 tbl.Columns.Add("teru2") 8 tbl.Columns.Add("teru3") 9 Next 10 11 ' table1に1行追加してそれぞれのDataTableの行数を表示 12 table1.Rows.Add() 13 Console.WriteLine("table1の行数:{0}", table1.Rows.Count) ' 114 Console.WriteLine("table2の行数:{0}", table2.Rows.Count) ' 015 Console.WriteLine("table3の行数:{0}", table3.Rows.Count) ' 016 End Using 17 18 Console.ReadLine() 19End Sub

投稿2017/06/02 00:00

編集2017/06/02 00:59
workaholist

総合スコア559

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xo001122

2017/06/02 00:31

上記のコードだとテーブルにテーブルを突っ込む形になるので、わたしコードと変わらないですね。それってパフォーマンス的にはどうなんでしょう…。 下記のコードは参考にしたいですが、コード量に差はなさそうですね。(どんな書き方でも列の定義と使用テーブルの生成は要るのでこれ以上は減らしようがない気もしますが(^_^;)
workaholist

2017/06/02 00:37

追記にも書きましたが違うと思います。 xo001122さんのコードは、変数はtable1~3の3つ、インスタンスは1つ。 私のコードは、変数はtable1~3の3つ、インスタンスも3つ。 です。
workaholist

2017/06/02 00:38

table1~3が同一インスタンスを指すポインタで良いということであれば私のコードが誤りです。
workaholist

2017/06/02 01:00

私の回答に追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問