DataTableに特定のフィールドが存在するかどうか調べる方法
- 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メソッド等のようなものを求めています) お分かりになる方がいましたら、宜しくお願いします。
- guccyonn
- お礼率90% (45/50)
- Visual Basic
- 回答数1
- ありがとう数3
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
DataColumnCollection.Contains メソッド http://msdn2.microsoft.com/ja-jp/library/system.data.datacolumncollection.contains(VS.80).aspx を使用すればよいと思います。 ちなみに、DataTable.Columns が DatacolumnCollection クラスです。
関連する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(); } }
- ベストアンサー
- Microsoft ASP
- 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) 教えて下さい。 よろしくお願いします。
- ベストアンサー
- Visual Basic
- 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
- ベストアンサー
- Visual Basic
- 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 何か良い方法はありませんか?
- ベストアンサー
- Visual Basic
- 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から取得したいと思います。アドバイスよろしくお願いいたします<(_ _)>
- ベストアンサー
- Visual Basic
- 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 どなたか分かる方、よろしくお願いいたします。
- ベストアンサー
- Visual Basic
- 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" '
- 締切済み
- Visual Basic
- テーブルのすべてのフィールド名を配列として取り出せ
テーブルのすべてのフィールド名を配列として取り出せるように変数に格納したいのですが 詰みました。 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; としてもできません・・・ ご教授お願い致します!
- ベストアンサー
- C・C++・C#
お礼
ありがとうございます。 助かりました。