DataTableに特定のフィールドが存在するかどうか調べる方法

このQ&Aのポイント
  • DataTableに登録されているフィールドに、特定のフィールドが存在しているかどうか調べる方法を教えてください。
  • 特定のフィールドがDataTableに存在するかどうかを確認する方法を知りたいです。
  • DataTable内のフィールドに特定のフィールドが登録されているかどうかを調べる方法を教えてください。
回答を見る
  • ベストアンサー

DataTableに特定のフィールドが存在するかどうか調べるには?

DataTableに登録されているフィールドに、特定のフィールドが存在しているかどうか調べるには、どのようにすればよいでしょうか? dtTable.Columns.Add("TEST1") dtTable.Columns.Add("TEST2") dtTableにTEST1とTEST2のフィールドが登録されていたとして、 Dim tmp As String = dtTable.Rows(0).Item("TEST3"),ToString TEST3のフィールド名で値を取得しようとすると、TEST3の列が登録されていない為、エラーとなります。 そこで、事前にTEST3というフィールドが、DataTableに存在するかどうか調べたいのです。 (ハッシュテーブルのContainsKeyメソッド等のようなものを求めています) お分かりになる方がいましたら、宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

DataColumnCollection.Contains メソッド http://msdn2.microsoft.com/ja-jp/library/system.data.datacolumncollection.contains(VS.80).aspx を使用すればよいと思います。 ちなみに、DataTable.Columns が DatacolumnCollection クラスです。

guccyonn
質問者

お礼

ありがとうございます。 助かりました。

関連するQ&A

  • DataSet(DataTable)の使い方

    GridViewやListViewなどに動的にデータを追加していきたいので、 DataTableを使おうと思いました。 下記、(1)のようにPageLoadイベントで1行追加することはできたのですが、 ボタンを押すごとに、1行ずつ追加していきたいので(2)のように修正したのですが、 ボタンを押したときのポストバックで、DataSetもDataTableもnullになってしまい、 行の追加ができません。 ボタンを押すごとにどんどん行を追加していきたいのですが、このような場合は どのようにDataSetもDataTableを保持しておけば良いのでしょうか。 (1) public partial class WebForm1 : System.Web.UI.Page { int count = 0; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { DataSet dS = new DataSet("dS"); DataTable dT = new DataTable("dT"); // データテーブル カラム作成 dT.Columns.Add("no", typeof(int)); dT.Columns.Add("name", typeof(string)); dT.Columns.Add("kind", typeof(string)); dT.Columns.Add("time", typeof(int)); dS.Tables.Add(dT); DataRow dR = dT.NewRow(); dR["no"] = count; dR["name"] = count.ToString(); dR["kind"] = count.ToString(); dR["time"] = count; dT.Rows.Add(dR); // リストビュー データソース選択 ListView2.DataSource = dS; ListView2.DataBind(); } } } (2) public partial class WebForm2 : System.Web.UI.Page { int count = 0; DataSet dS; DataTable dT; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { dS = new DataSet("dS"); dT = new DataTable("dT"); // データテーブル カラム作成 dT.Columns.Add("no", typeof(int)); dT.Columns.Add("name", typeof(string)); dT.Columns.Add("kind", typeof(string)); dT.Columns.Add("time", typeof(int)); dS.Tables.Add(dT); } } protected void Button1_Click(object sender, EventArgs e) { count = count + 1; DataRow dR = dT.NewRow(); dR["no"] = count; dR["name"] = count.ToString(); dR["kind"] = count.ToString(); dR["time"] = count; dT.Rows.Add(dR); // リストビュー データソース選択 ListView2.DataSource = dS; ListView2.DataBind(); } }

  • Datatableへの代入

    環境はVS2005です。 以下のように読込んだデータをdatatblに格納し、 DataGridにバインドしたいのですが、コンパイルは通りますが、 エラーとなってしまいます。 どのように解決すればよいのでしょうか? DataTable tbl = new DataTable(); while (sqlDataReader.Read()) {   tbl.Rows.Add(sqlDataReader["banner_id"].ToString());  tbl.Rows.Add(sqlDataReader["Adv"].ToString()); } sqlDataReader.Close(); this.DataGridView.DataSource = tbl; this.DataGridView.DataBind(); エラーメッセージ:入力配列がこのテーブルの列数より長い値です すみませんが、よろしくお願い致します。

  • DataTableの件数に関して

    フォーム上に”DataGridView”を貼り付け、そこへ1行ずつ、複数行データを入力するような 事を考えています。 厳密には、”DataGridView”のセルをダブルクリックした時に、他のDBから検索された 結果を貼り付ける(表示)ような事をしています。 その際に、”Datatable”と”DataGridView”をバインドし、ダブルクリックされたら”DataTable” へ追加し表示というような事をしていますが、1件目(1行目)をクリック⇒表示、2件目(2行目) クリック⇒表示という場合には正しく表示されますが、1件目(1行目)クリック⇒表示の後、再度 1行目をクリックして表示した場合、なぜか”DataTable”の件数が、追加もしていないのに 最初から2件となっていて、さらに処理が終わった後には、2件となっているはずが3件となって いて、さらに空白の行が追加されてしまっています。 どうしてもこの現象から脱する事ができず、助けて頂ければと思います。 “DataTable”への追加は、問題ないかとは思われますが、、、 ★ 記述内容 Dim data_row As DataRow = dtTable.NewRow() data_row("発注番号") = PIN_発注番号 data_row("発注日付") = KIN_発注日付 dtTable.Rows.Add(data_row) DataGridView1.DataSource = dtSet.Tables(0) 教えて下さい。 よろしくお願いします。

  • VB.NETでのデータベース書き込みについて

    リストレビューに表示されているデータをデータベースに書き込む処理を追加したいのですが、データセットにメモリ上のテーブルを作成してデータベースへ書き込む方が良いのでしょうか? それとも直接データベースに書き込む方が良いのでしょうか? 前者のテーブル作成のコードは書きの通りです。 Public Function AddDataSetTable(ByVal kojo_cd() As String, ByVal kojo_name() As String, ByVal kojo_date() As String)   Dim dtSet As New DataSet("DataSetTable")   Dim dtTable As New DataTable("CalDatTable")   Dim fmain As New FrmMain   Dim i As Integer   'テーブルに列を追加    With dtTable.Columns     .Add("コード")     .Add("名称")     .Add("日にち")    End With   'テーブルに行を追加   With dtTable.Rows    For i = 0 To UBound(kojo_cd)     .Add(New Object() {kojo_cd(i), kojo_name(i), kojo_date(i)})    Next i   End With   'データセットにテーブルを追加   dtSet.Tables.Add(dtTable) End Function

  • vbでDataTableの抽出コピー

    vbでDataTableの抽出コピー DataTableから条件抽出したデータで別のDataTableを作成したい ・DataTable1から条件抽出したデータで別のDataTableを作成したい ・データの件数が違うだけでヘッダーなどの内容は同じにしたい Dim DataTable1 As DataTable ' 既にテーブルデータが入っているとする Dim DataTable2 As DataTable ' これに一部のデータとヘッダーを複写 Dim DataRow1 As DataRow ' DataRowの一時領域1 Dim DataRow2 As DataRow ' DataRowの一時領域2 <試作1:NG DataRowの使いまわしがきかない> DataTable2 = DataTable1.Clone For Each DataRow1 In DataTable1.Select(条件, ソート) DataTable2.Rows.Add(DataRow1) Next DataRow1 <試作2:NG ワンクッションかましただけではダメ> DataTable2 = DataTable1.Clone For Each DataRow1 In DataTable1.Select(条件, ソート) DataRow2 = DataRow1 DataTable2.Rows.Add(DataRow2) Next DataRow1 もしかして、個別セット以外に道はないのでしょうか? DataTable2 = DataTable1.Clone For Each DataRow1 In DataTable1.Select(条件, ソート) DataRow2 = DataTable2.NewRow DataRow2("item1") = DataRow1("item1") DataRow2("item2") = DataRow1("item2") DataRow2("item3") = DataRow1("item3") DataRow2("item4") = DataRow1("item4") DataRow2("item5") = DataRow1("item5") DataRow2("item6") = DataRow1("item6") DataRow2("item7") = DataRow1("item7") DataRow2("item8") = DataRow1("item8") DataTable2.Rows.Add(DataRow2) Next DataRow1 何か良い方法はありませんか?

  • DataGridViewで行選択して、対応するDataTableの行を得るには?

    いつもお世話になっております。VB2005環境です。 DataGridViewの行を選択したときに、そのソースであるDataTableの同じ行のデータを参照するには、どうしたらいいでしょうか。DataTableのデータをまるごとDataGridViewに表示しているわけではないので、必要に応じて直接DataTableから取得したいです。とても初歩的な質問だと思うのですが・・・。 DataGridView1.DataSource = DataTable  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ Dim r As Integer = DataGridView1.CurrentCell.RowIndex Dim str As String str = DataTable.Rows(r)("項目名") MsgBox(str)  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ このように行インデックスを取得してやってみたのですが、これだとDataGridView上でソートすると行番号が変わってしまい、DataTable側の対応する行のデータが得られません。 もう少し詳しく現状を書くと、まずCSVファイルからデータをロードして、DataTableに渡しています。そして、その内容をDataGridViewに表示しているのですが、表示する内容はデータテーブル通りの構造ではなく、表示する必要がある項目だけを選んで、1つずつカラムを追加してバインドいます。  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ’自動で列を追加しないようにする DataGridView1.AutoGenerateColumns = False ’データソースを指定する DataGridView1.DataSource = DataTable ’1つ1つ順番などを変えながら列を追加していく Dim column1 As New DataGridViewTextBoxColumn() DataGridView1.Columns.Add(column1) column1.Name = "Date" column1.HeaderText = "日付" column1.DataPropertyName = "F4" Dim column2 As New DataGridViewTextBoxColumn() DataGridView1.Columns.Add(column1) column1.Name = "Locatoin" column1.HeaderText = "場所" column2.DataPropertyName = "F1" ・ ・ ・  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ こんな感じでなので、表示されていない列のデータについては、必要に応じて直接DataTableから取得したいと思います。アドバイスよろしくお願いいたします<(_ _)>

  • DataTableで重複行を削除したい

    こんにちは。 DataTableで重複した行を削除するプログラムが作れず悩んでいます。 もしよろしければ、教えてもらえないでしょうか? 例えば下記のようなDataTableのとき。 ID CD ------------- 5  A1 6  A2 8  A3 9  A4 10  A5 5  A6 10  A7 NULL A8 NULL A9 NULL A10 ------------- 下記のようにしたいと思っています。 ID CD ------------- 5  A1 6  A2 8  A3 9  A4 10  A5 NULL A8 ------------- 重複しているレコードは最初にヒットしたものを残します。 そこで下記のようなプログラムを書いてみたのですが、駄目でした。 ' 重複行を削除する For i = 0 To DataTable.Rows.Count - 1 Index = temp.IndexOf(DataTable.Rows(i).Item("id")) If Index = -1 Then temp.Add(DataTable.Rows(i).Item("id")) Else dr = DataTable.Rows(i) DataTable.Rows.Remove(dr) If i = DataTable.Rows.Count - 1 Then Exit For End If i = i - 1 End If Next どなたか分かる方、よろしくお願いいたします。

  • DataTableのデータを保存したい

    VB初心者です VB2008を使用してカロリー計算ができるプログラムを作成しています DataTableに摂取カロリーと消費カロリーをユーザが追加でき、 そのDataTableのデータをCSVファイルとして保存しようと考えています こちらのサイトhttp://pckowaza.web.fc2.com/html/vbdotnet_datagridview_savetocsv.html からコピーしてやってみたのですが Public Sub SaveToCsv(tempDgv As System.Windows.Forms.DataGridView)' のパラメータ 'tempDgv' に対して引数が指定されていません。 とエラーが出ます どこを直せば良いのでしょうか? 以下、プログラムです '保存したいDataGridViewコントロールの名前を引数として '設定します。 Public Sub SaveToCsv(ByVal tempDgv As DataGridView)   '1行もデータが無い場合は、保存を中止します。   If tempDgv.Rows.Count = 0 Then     Exit Sub   End If   '変数を定義します。   Dim i As Integer   Dim j As Integer   Dim strFileName As String   Dim strResult As New System.Text.StringBuilder   '保存ダイアログでファイル名を設定した場合に処理を実行します。   If Me.sfdCsvFile.ShowDialog = _     Windows.Forms.DialogResult.OK Then     'コラムヘッダを1行目に列記します。     '※ヘッダ行が不要な場合は削除可能です。     For i = 0 To tempDgv.Columns.Count - 1       Select Case i         Case 0          strResult.Append("""" & _          tempDgv.Columns(i).HeaderText.ToString & """")         Case tempDgv.Columns.Count - 1          strResult.Append("," & """" & _          tempDgv.Columns(i).HeaderText.ToString & _          """" & vbCrLf)         Case Else          strResult.Append("," & """" & _          tempDgv.Columns(i).HeaderText.ToString & """")       End Select     Next     'データを保存します。     '※新規行の追加を認めている場合は、次行の     「tempDgv.Columns.Count - 1」を     '「tempDgv.Columns.Count - 2」としてください。     For i = 0 To tempDgv.Rows.Count - 1       For j = 0 To tempDgv.Columns.Count - 1         Select Case j           Case 0            strResult.Append("""" & _            tempDgv.Rows(i).Cells(j).Value.ToString & _            """")           Case tempDgv.Columns.Count - 1            strResult.Append("," & """" & _            tempDgv.Rows(i).Cells(j).Value.ToString & _            """" & vbCrLf)           Case Else            strResult.Append("," & """" & _            tempDgv.Rows(i).Cells(j).Value.ToString & _            """")         End Select       Next     Next     'ファイル名を保存ダイアログで指定した値に設定します。     strFileName = Me.sfdCsvFile.FileName     'Shift-JISで保存します。     Dim swText As New System.IO.StreamWriter(strFileName, _       False, System.Text.Encoding.GetEncoding(932))     swText.Write(strResult.ToString)     swText.Dispose()   End If End Sub DataGridViewの定義?はこれです Designer.vbに書かれていたものです 'DataGridView1 ' Me.DataGridView1.AutoGenerateColumns = False Me.DataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize Me.DataGridView1.Columns.AddRange(New System.Windows.Forms.DataGridViewColumn() {Me.名前DataGridViewTextBoxColumn, Me.カロリーkcalDataGridViewTextBoxColumn}) Me.DataGridView1.DataSource = Me.DataTable1BindingSource3 Me.DataGridView1.Location = New System.Drawing.Point(424, 35) Me.DataGridView1.Name = "DataGridView1" Me.DataGridView1.RowTemplate.Height = 21 Me.DataGridView1.Size = New System.Drawing.Size(429, 422) Me.DataGridView1.TabIndex = 3 ' '名前DataGridViewTextBoxColumn ' Me.名前DataGridViewTextBoxColumn.DataPropertyName = "名前" Me.名前DataGridViewTextBoxColumn.HeaderText = "名前" Me.名前DataGridViewTextBoxColumn.Name = "名前DataGridViewTextBoxColumn" ' 'カロリーkcalDataGridViewTextBoxColumn ' Me.カロリーkcalDataGridViewTextBoxColumn.DataPropertyName = "カロリー(kcal)" Me.カロリーkcalDataGridViewTextBoxColumn.HeaderText = "カロリー(kcal)" Me.カロリーkcalDataGridViewTextBoxColumn.Name = "カロリーkcalDataGridViewTextBoxColumn" '

  • テーブルのすべてのフィールド名を配列として取り出せ

    テーブルのすべてのフィールド名を配列として取り出せるように変数に格納したいのですが 詰みました。 Private Sub test() Dim cat As ADOX.Catalog Dim clm As ADOX.Column Dim tmp As Variant Dim myTable As String myTable = "T_Table" Set cat = CreateObject("ADOX.Catalog") cat.ActiveConnection = CurrentProject.Connection For Each clm In cat.Tables(myTable).columns tmp = Array("フィールド1", "フィールド2") Next clm End Sub のようなことがしたいのですが、clm.nameでせっかく名前が取得できるのに、 どうやったらtmpに格納できるのでしょうか? Arrayを使わない方法はあるのでしょうか?

  • C#で型変換

    DataTable T_DATATABLE = new DataTable(); DataRow[] T_DATATABLE_row; DataAdapter adp = new DataAdapter("SELECT id,Date FROM TABLE", CONN); adp.Fill(T_DATATABLE); //データテーブルにidとDateフィールドがあります。 //dtに下記で取得したダータを入れようと思っているのですが、 //System.Datetimeに変換することはできませんと表示されます。 DateTime dt = T_DATATABLE.Rows[0]["Date"]; どのようにすれば、型変換をすることができるでしょうか? string dt = (string)T_DATATABLE.Rows[0]["Date"]; string dt = (string)T_DATATABLE.Rows[0]["Date"].toString; としてもできません・・・ ご教授お願い致します!

専門家に質問してみよう